# Suporte a marshalling de dados

Essas rotinas permitem que o código C trabalhe com objetos serializados usando o mesmo formato de dados que o módulo `marshal`. Existem funções para gravar dados no formato de serialização e funções adicionais que podem ser usadas para ler os dados novamente. Os arquivos usados para armazenar dados empacotados devem ser abertos no modo binário.

Os valores numéricos são armazenados primeiro com o byte menos significativo.

O módulo possui suporte a duas versões do formato de dados: a versão 0 é a versão histórica, a versão 1 compartilha strings internas no arquivo e após a desserialização. A versão 2 usa um formato binário para números de ponto flutuante. `Py_MARSHAL_VERSION` indica o formato do arquivo atual (atualmente 2).

void `PyMarshal_WriteLongToFile`(long value, FILE *file, int version)

  Aplica marshalling em um inteiro `long`, value, para file. Isso escreverá apenas os 32 bits menos significativos de value; independentemente do tamanho do tipo nativo `long`. version indica o formato do arquivo.

  Esta função pode falhar, caso em que define o indicador de erro. Use `PyErr_Occurred()` para verificar isso.

void `PyMarshal_WriteObjectToFile`(PyObject *value, FILE *file, int version)

  Aplica marshalling em um objeto Python, value, para file. version indica o formato do arquivo.

  Esta função pode falhar, caso em que define o indicador de erro. Use `PyErr_Occurred()` para verificar isso.

PyObject* `PyMarshal_WriteObjectToString`(PyObject *value, int version)
  Return value: New reference.

  Retorna um objeto de bytes que contém a representação pós-marshalling de value. version indica o formato do arquivo.

As seguintes funções permitem que os valores pós-marshalling sejam lidos novamente.

long `PyMarshal_ReadLongFromFile`(FILE *file)

  Retorna um `long` C do fluxo de dados em um `FILE*` aberto para leitura. Somente um valor de 32 bits pode ser lido usando essa função, independentemente do tamanho nativo de `long`.

  Em caso de erro, define a exceção apropriada (`EOFError`) e retorna `-1`.

int `PyMarshal_ReadShortFromFile`(FILE *file)

  Retorna um `short` C do fluxo de dados em um `FILE*` aberto para leitura. Somente um valor de 16 bits pode ser lido usando essa função, independentemente do tamanho nativo de `short`.

  Em caso de erro, define a exceção apropriada (`EOFError`) e retorna `-1`.

PyObject* `PyMarshal_ReadObjectFromFile`(FILE *file)
  Return value: New reference.

  Retorna um objeto Python do fluxo de dados em um `FILE*` aberto para leitura.

  Em caso de erro, define a exceção apropriada (`EOFError`, `ValueError` ou `TypeError`) e retorna `NULL`.

PyObject* `PyMarshal_ReadLastObjectFromFile`(FILE *file)
  Return value: New reference.

  Retorna um objeto Python do fluxo de dados em um `FILE*` aberto para leitura. Diferentemente de `PyMarshal_ReadObjectFromFile()`, essa função presume que nenhum objeto adicional será lido do arquivo, permitindo que ele carregue agressivamente os dados do arquivo na memória, para que a desserialização possa operar a partir de dados na memória em vez de ler um byte por vez do arquivo. Use essas variantes apenas se tiver certeza de que não estará lendo mais nada do arquivo.

  Em caso de erro, define a exceção apropriada (`EOFError`, `ValueError` ou `TypeError`) e retorna `NULL`.

PyObject* `PyMarshal_ReadObjectFromString`(const char *data, Py_ssize_t len)
  Return value: New reference.

  Retorna um objeto Python do fluxo de dados em um buffer de bytes contendo len bytes apontados por data.

  Em caso de erro, define a exceção apropriada (`EOFError`, `ValueError` ou `TypeError`) e retorna `NULL`.