logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Stdlib.Marshal - no description

Documentation

       Module Marshal
        : (moduleStdlib__Marshal)typeextern_flags =
        | No_sharing  (* Don't preserve sharing
        *)
        | Closures  (* Send function closures
        *)
        | Compat_32  (* Ensure 32-bit compatibility
        *)

       The flags to the Marshal.to_* functions below.

       valto_channel : out_channel->'a->extern_flagslist->unitMarshal.to_channelchanvflags writes the representation of v on channel chan . The flags argument is a
       possibly empty list of flags that governs the marshaling behavior with  respect  to  sharing,  functional
       values, and compatibility between 32- and 64-bit platforms.

       If  flags does not contain Marshal.No_sharing , circularities and sharing inside the value v are detected
       and preserved in the sequence of bytes produced. In particular, this guarantees  that  marshaling  always
       terminates.  Sharing  between  values  marshaled  by  successive  calls  to Marshal.to_channel is neither
       detected nor preserved, though.  If flags contains Marshal.No_sharing , sharing is ignored.  This results
       in faster marshaling if v contains no shared substructures, but may cause slower  marshaling  and  larger
       byte representations if v actually contains sharing, or even non-termination if v contains cycles.

       If  flags  does  not  contain  Marshal.Closures  , marshaling fails when it encounters a functional value
       inside v : only 'pure'  data  structures,  containing  neither  functions  nor  objects,  can  safely  be
       transmitted  between  different  programs. If flags contains Marshal.Closures , functional values will be
       marshaled as a the position in the code of the program together with the values corresponding to the free
       variables captured in the closure.  In this case, the output of marshaling  can  only  be  read  back  in
       processes  that  run  exactly  the same program, with exactly the same compiled code. (This is checked at
       un-marshaling time, using an MD5 digest of the code transmitted along with the code position.)

       The exact definition of which free variables are captured in a closure is  not  specified  and  can  vary
       between  bytecode and native code (and according to optimization flags).  In particular, a function value
       accessing a global reference may or  may  not  include  the  reference  in  its  closure.   If  it  does,
       unmarshaling the corresponding closure will create a new reference, different from the global one.

       If  flags  contains  Marshal.Compat_32 , marshaling fails when it encounters an integer value outside the
       range -2 ^ 30 , 2 ^ 30-1 of integers that are representable on a 32-bit  platform.   This  ensures  that
       marshaled  data  generated  on  a 64-bit platform can be safely read back on a 32-bit platform.  If flags
       does not contain Marshal.Compat_32 , integer values outside the range -2 ^ 30 , 2 ^ 30-1 are  marshaled,
       and  can  be read back on a 64-bit platform, but will cause an error at un-marshaling time when read back
       on a 32-bit platform.  The Mashal.Compat_32 flag only matters when marshaling is performed  on  a  64-bit
       platform; it has no effect if marshaling is performed on a 32-bit platform.

       RaisesFailure if chan is not in binary mode.

       valto_bytes : 'a->extern_flagslist->bytesMarshal.to_bytesvflags returns a byte sequence containing the representation of v .  The flags argument
       has the same meaning as for Marshal.to_channel .

       Since 4.02

       valto_string : 'a->extern_flagslist->string

       Same as to_bytes but return the result as a string instead of a byte sequence.

       valto_buffer : bytes->int->int->'a->extern_flagslist->intMarshal.to_bufferbuffofslenvflags marshals the value v , storing its byte representation in the
       sequence buff , starting at index ofs , and writing at most len bytes.  It returns the  number  of  bytes
       actually  written  to  the  sequence. If the byte representation of v does not fit in len characters, the
       exception Failure is raised.

       valfrom_channel : in_channel->'aMarshal.from_channelchan reads from channel chan the byte  representation  of  a  structured  value,  as
       produced by one of the Marshal.to_* functions, and reconstructs and returns the corresponding value.

       RaisesEnd_of_file if chan is already at the end of the file.

       RaisesFailure if the end of the file is reached during unmarshalling itself or if chan is not in binary
       mode.

       valfrom_bytes : bytes->int->'aMarshal.from_bytesbuffofs unmarshals a structured value like Marshal.from_channel does, except that the
       byte representation is not read from a channel, but taken from the  byte  sequence  buff  ,  starting  at
       position ofs .  The byte sequence is not mutated.

       Since 4.02

       valfrom_string : string->int->'a

       Same as from_bytes but take a string as argument instead of a byte sequence.

       valheader_size : int

       The  bytes  representing  a marshaled value are composed of a fixed-size header and a variable-sized data
       part, whose size can be determined from the header.  Marshal.header_size is the size, in  bytes,  of  the
       header.   Marshal.data_sizebuffofs is the size, in bytes, of the data part, assuming a valid header is
       stored in buff starting at position ofs .  Finally, Marshal.total_sizebuffofs is  the  total  size,  in
       bytes, of the marshaled value.  Both Marshal.data_size and Marshal.total_size raise Failure if buff , ofs
       does not contain a valid header.

       To  read  the  byte  representation  of a marshaled value into a byte sequence, the program needs to read
       first Marshal.header_size bytes into the sequence, then determine the length  of  the  remainder  of  the
       representation  using  Marshal.data_size  ,  make sure the sequence is large enough to hold the remaining
       data, then read it, and finally call Marshal.from_bytes to unmarshal the value.

       valdata_size : bytes->int->int

       See Marshal.header_size .

       valtotal_size : bytes->int->int

       See Marshal.header_size .

   Marshalanddomainsafety
       Care must be taken when marshaling a mutable value that may be modified by a different domain. Mutating a
       value that is being marshaled (i.e., turned into a sequence of bytes) is a programming  error  and  might
       result  in  surprising values (when unmarshaling) due to tearing, since marshaling involves byte-per-byte
       copy.

OCamldoc                                           2025-06-12                                 Stdlib.Marshal(3o)

Module

       Module   Stdlib.Marshal

Name

       Stdlib.Marshal - no description

See Also