Python Data Persistence - Marshal Module

Le funzionalità di serializzazione degli oggetti del modulo marshal nella libreria standard di Python sono simili al modulo pickle. Tuttavia, questo modulo non viene utilizzato per dati di uso generale. D'altra parte, viene utilizzato da Python stesso per la serializzazione interna degli oggetti di Python per supportare le operazioni di lettura / scrittura sulle versioni compilate dei moduli Python (file .pyc).

Il formato dei dati utilizzato dal modulo marshal non è compatibile con le versioni di Python. Pertanto, uno script Python compilato (file .pyc) di una versione molto probabilmente non verrà eseguito su un'altra.

Proprio come il modulo pickle, il modulo marshal ha anche definito le funzioni load () e dump () per leggere e scrivere oggetti di marshalling da / a file.

dump ()

Questa funzione scrive la rappresentazione in byte dell'oggetto Python supportato in un file. Il file stesso è un file binario con autorizzazione di scrittura

caricare()

Questa funzione legge i dati in byte da un file binario e li converte in un oggetto Python.

L'esempio seguente mostra l'uso delle funzioni dump () e load () per gestire oggetti codice di Python, che vengono utilizzati per memorizzare moduli Python precompilati.

Il codice utilizza built-in compile() funzione per costruire un oggetto codice da una stringa sorgente che incorpora istruzioni Python.

compile(source, file, mode)

Il parametro file dovrebbe essere il file da cui è stato letto il codice. Se non è stato letto da un file, passare una stringa arbitraria.

Il parametro mode è 'exec' se l'origine contiene una sequenza di istruzioni, 'eval' se c'è una singola espressione o 'single' se contiene una singola istruzione interattiva.

L'oggetto codice di compilazione viene quindi memorizzato in un file .pyc utilizzando la funzione dump ().

import marshal
script = """
a=10
b=20
print ('addition=',a+b)
"""
code = compile(script, "script", "exec")
f=open("a.pyc","wb")
marshal.dump(code, f)
f.close()

Per deserializzare, l'oggetto dal file .pyc utilizza la funzione load (). Poiché restituisce un oggetto codice, può essere eseguito utilizzando exec (), un'altra funzione incorporata.

import marshal
f=open("a.pyc","rb")
data=marshal.load(f)
exec (data)