| .. highlightlang:: c | 
 |  | 
 | .. _marshalling-utils: | 
 |  | 
 | Data marshalling support | 
 | ======================== | 
 |  | 
 | These routines allow C code to work with serialized objects using the same | 
 | data format as the :mod:`marshal` module.  There are functions to write data | 
 | into the serialization format, and additional functions that can be used to | 
 | read the data back.  Files used to store marshalled data must be opened in | 
 | binary mode. | 
 |  | 
 | Numeric values are stored with the least significant byte first. | 
 |  | 
 | The module supports two versions of the data format: version 0 is the | 
 | historical version, version 1 shares interned strings in the file, and upon | 
 | unmarshalling.  Version 2 uses a binary format for floating point numbers. | 
 | *Py_MARSHAL_VERSION* indicates the current file format (currently 2). | 
 |  | 
 |  | 
 | .. cfunction:: void PyMarshal_WriteLongToFile(long value, FILE *file, int version) | 
 |  | 
 |    Marshal a :ctype:`long` integer, *value*, to *file*.  This will only write | 
 |    the least-significant 32 bits of *value*; regardless of the size of the | 
 |    native :ctype:`long` type.  *version* indicates the file format. | 
 |  | 
 |  | 
 | .. cfunction:: void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version) | 
 |  | 
 |    Marshal a Python object, *value*, to *file*. | 
 |    *version* indicates the file format. | 
 |  | 
 |  | 
 | .. cfunction:: PyObject* PyMarshal_WriteObjectToString(PyObject *value, int version) | 
 |  | 
 |    Return a string object containing the marshalled representation of *value*. | 
 |    *version* indicates the file format. | 
 |  | 
 |  | 
 | The following functions allow marshalled values to be read back in. | 
 |  | 
 | XXX What about error detection?  It appears that reading past the end of the | 
 | file will always result in a negative numeric value (where that's relevant), | 
 | but it's not clear that negative values won't be handled properly when there's | 
 | no error.  What's the right way to tell? Should only non-negative values be | 
 | written using these routines? | 
 |  | 
 |  | 
 | .. cfunction:: long PyMarshal_ReadLongFromFile(FILE *file) | 
 |  | 
 |    Return a C :ctype:`long` from the data stream in a :ctype:`FILE\*` opened | 
 |    for reading.  Only a 32-bit value can be read in using this function, | 
 |    regardless of the native size of :ctype:`long`. | 
 |  | 
 |  | 
 | .. cfunction:: int PyMarshal_ReadShortFromFile(FILE *file) | 
 |  | 
 |    Return a C :ctype:`short` from the data stream in a :ctype:`FILE\*` opened | 
 |    for reading.  Only a 16-bit value can be read in using this function, | 
 |    regardless of the native size of :ctype:`short`. | 
 |  | 
 |  | 
 | .. cfunction:: PyObject* PyMarshal_ReadObjectFromFile(FILE *file) | 
 |  | 
 |    Return a Python object from the data stream in a :ctype:`FILE\*` opened for | 
 |    reading.  On error, sets the appropriate exception (:exc:`EOFError` or | 
 |    :exc:`TypeError`) and returns *NULL*. | 
 |  | 
 |  | 
 | .. cfunction:: PyObject* PyMarshal_ReadLastObjectFromFile(FILE *file) | 
 |  | 
 |    Return a Python object from the data stream in a :ctype:`FILE\*` opened for | 
 |    reading.  Unlike :cfunc:`PyMarshal_ReadObjectFromFile`, this function | 
 |    assumes that no further objects will be read from the file, allowing it to | 
 |    aggressively load file data into memory so that the de-serialization can | 
 |    operate from data in memory rather than reading a byte at a time from the | 
 |    file.  Only use these variant if you are certain that you won't be reading | 
 |    anything else from the file.  On error, sets the appropriate exception | 
 |    (:exc:`EOFError` or :exc:`TypeError`) and returns *NULL*. | 
 |  | 
 |  | 
 | .. cfunction:: PyObject* PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len) | 
 |  | 
 |    Return a Python object from the data stream in a character buffer | 
 |    containing *len* bytes pointed to by *string*.  On error, sets the | 
 |    appropriate exception (:exc:`EOFError` or :exc:`TypeError`) and returns | 
 |    *NULL*. | 
 |  |