Python 序列化与反序列化
1、定义
serialization
序列化:要设计一套协议,按照某种规则,把内存中数据保存到文件中。文件是一个字节序列,所以必须把数据转换成字节序列,输出到文件。这就是序列化。deserialization
反序列化:反之,从文件的字节序列恢复到内存中并且还原原来的类型,就是反序列化。- 序列化保存到文件就是持久化。可以将数据序列化后持久化,或者网络传输;也可以将从文件中或者网络接收到的字节序列反序列化。
2、pickle
库
pickle
库是 Python 中的序列化/反序列化模块pickle
库不推荐使用,序列化后所占空间比较大,不利于网络传输和硬盘存储,但是便于大家理解序列化和反序列化原理
2.1 pickle
库函数方法
2.2 dump 和 load 示例
-
序列化字符
'a'
In [259]: import pickle In [260]: from pathlib import Path In [261]: chr(97) Out[261]: 'a' In [268]: hex(97) Out[268]: '0x61' In [262]: i = 'a' In [263]: filename = Path('ser.txt') In [266]: with open(filename, 'rb+') as f: ...: print(f.read()) ...: f.seek(0, 0) ...: x = pickle.load(f) ...: print(x, type(x)) ...: b'\x80\x04\x95\x05\x00\x00\x00\x00\x00\x00\x00\x8c\x01a\x94.' a <class 'str'>
# 十六进制 查看 序列化 后的文件 [root@Sybil sybil]#hexdump ser.txt 0000000 0480 0595 0000 0000 0000 8c00 6101 2e94 0000010
-
序列化数字
97
In [269]: i = 97 In [270]: filename = Path('ser.txt') In [271]: with open(filename, 'wb+') as f: ...: pickle.dump(i, f) ...: In [272]: with open(filename, 'rb+') as f: ...: print(f.read()) ...: f.seek(0, 0) ...: x = pickle.load(f) ...: print(x, type(x)) ...: ...: b'\x80\x04Ka.' 97 <class 'int'>
# 十六进制 查看 序列化 后的文件 [root@Sybil sybil]#hexdump ser.txt 0000000 0480 614b 002e 0000005
-
序列化字符
’97‘
In [273]: i = '97' In [274]: filename = Path('ser.txt') In [275]: with open(filename, 'wb+') as f: ...: pickle.dump(i, f