Python标准库marshal可以进行对象的序列化和反序列化。
>>> import marshal
# 待序列化的对象
>>> x1 = 30
>>> x2 = 5.0
>>> x3 = [1, 2, 3]
>>> x4 = (4, 5, 6)
>>> x5 = {'a':1, 'b':2, 'c':3}
>>> x6 = {7, 8, 9}
# 把需要序列化的对象放到一个列表中
>>> x = [eval('x'+str(i)) for i in range(1,7)]
>>> x
[30, 5.0, [1, 2, 3], (4, 5, 6), {'a': 1, 'b': 2, 'c': 3}, {8, 9, 7}]
>>> with open('test.dat', 'wb') as fp:
#先写入对象个数
marshal.dump(len(x), fp)
for item in x:
# 把列表中的对象依次序列化并写入文件
marshal.dump(item,fp)
>>> with open('test.dat', 'rb') as fp:
# 获取对象个数
n = marshal.load(fp)
for i in range(n):
# 反序列化,输出结果
print(marshal.load(fp))
30
5.0
[1, 2, 3]
(4, 5, 6)
{'a': 1, 'b': 2, 'c': 3}
{8, 9, 7}
与pickle类似,marshal也提供了dumps()和loads()函数来实现数据的序列化和反序列化,从下面的结果可以看出,使用marshal序列化后的字节串更短一些,可以减少磁盘空间或网络带宽的占用。
>>> import marshal
>>> marshal.dumps('董付国')
b'\xf5\t\x00\x00\x00\xe8\x91\xa3\xe4\xbb\x98\xe5\x9b\xbd'
>>> marshal.loads(_)
'董付国'
>>> len(marshal.dumps('董付国'))
14
>>> import pickle
>>> len(pickle.dumps('董付国'))
19