データマーシャリングのサポート
これらのルーチンにより、Cコードは marshal モジュールと同じデータ形式を使用してシリアル化されたオブジェクトを処理できます。 シリアル化形式でデータを書き込む関数と、データを読み戻すために使用できる追加の関数があります。 マーシャリングされたデータの保存に使用されるファイルは、バイナリモードで開く必要があります。
数値は最下位バイトを最初に格納されます。
このモジュールは、データ形式の2つのバージョンをサポートします。バージョン0
は履歴バージョンであり、バージョン1
(Python 2.4の新機能)はファイル内のインターン文字列を共有し、アンマーシャリング時に使用します。 バージョン2(Python 2.5の新機能)は、浮動小数点数にバイナリ形式を使用します。 Py_MARSHAL_VERSION は、現在のファイル形式(現在は2)を示します。
- void PyMarshal_WriteLongToFile(long value, FILE *file, int version)
long
整数、値をファイルにマーシャリングします。 これは、値の最下位32ビットのみを書き込みます。 ネイティブlong
タイプのサイズに関係なく。バージョン2.4で変更: バージョンはファイル形式を示します。
- void PyMarshal_WriteObjectToFile(PyObject *value, FILE *file, int version)
Pythonオブジェクト value を file にマーシャリングします。
バージョン2.4で変更: バージョンはファイル形式を示します。
- PyObject *PyMarshal_WriteObjectToString(PyObject *value, int version)
value のマーシャリング表現を含む文字列オブジェクトを返します。
バージョン2.4で変更: バージョンはファイル形式を示します。
次の関数を使用すると、マーシャリングされた値をに読み戻すことができます。
XXXエラー検出はどうですか? ファイルの終わりを超えて読み取ると、常に負の数値になるようです(関連する場合)が、エラーがない場合に負の値が適切に処理されないことは明らかではありません。 伝える正しい方法は何ですか? これらのルーチンを使用して、負でない値のみを書き込む必要がありますか?
- long PyMarshal_ReadLongFromFile(FILE *file)
- 読み取り用に開いた
FILE*
のデータストリームからClong
を返します。long
のネイティブサイズに関係なく、この関数を使用して読み取ることができるのは32ビット値のみです。
- int PyMarshal_ReadShortFromFile(FILE *file)
- 読み取り用に開いた
FILE*
のデータストリームからCshort
を返します。short
のネイティブサイズに関係なく、この関数を使用して読み取ることができるのは16ビット値のみです。
- PyObject *PyMarshal_ReadObjectFromFile(FILE *file)
- 読み取り用に開いた
FILE*
のデータストリームからPythonオブジェクトを返します。 エラーの場合、適切な例外(EOFError
またはTypeError
)を設定し、 NULL を返します。
- PyObject *PyMarshal_ReadLastObjectFromFile(FILE *file)
- 読み取り用に開いた
FILE*
のデータストリームからPythonオブジェクトを返します。 PyMarshal_ReadObjectFromFile()とは異なり、この関数は、ファイルからそれ以上オブジェクトが読み取られないことを前提としているため、ファイルデータをメモリに積極的にロードできるため、逆シリアル化では、メモリ内のデータを読み取るのではなく、メモリ内のデータから操作できます。ファイルから一度に1バイト。 これらのバリアントは、ファイルから他に何も読み取らないことが確実な場合にのみ使用してください。 エラーの場合、適切な例外(EOFError
またはTypeError
)を設定し、 NULL を返します。
- PyObject *PyMarshal_ReadObjectFromString(char *string, Py_ssize_t len)
string が指す len バイトを含む文字バッファー内のデータストリームからPythonオブジェクトを返します。 エラーの場合、適切な例外(
EOFError
またはTypeError
)を設定し、 NULL を返します。バージョン2.5で変更:この関数は、 len に
int
タイプを使用していました。 これには、64ビットシステムを適切にサポートするためにコードの変更が必要になる場合があります。