python的序列化和反序列化

4,867 阅读2分钟

1. 什么是序列化?

当程序运行时,所有的变量或者对象都是存储到内存中的,一旦程序调用完成,这些变量或者对象所占有的内存都会被回收。而为了实现变量和对象持久化的存储到磁盘中或在网络上进行传输,我们需要将变量或者对象转化为二进制流的方式。 而将其转化为二进制流的过程就是序列化。

2. 什么是反序列化

而反序列化就是说程序运行的时候不能从磁盘中进行读取,需要将序列化的对象或者变量从磁盘中转移到内存中,同时也会将二进制流转换为原来的数据格式。我们把这一过程叫做反序列化。

3. python如何实现序列化和反序列化

这里主要讲两个模块pickle模块和json模块

3.1 pickle模块

dump(object)和dumps(objects)是序列化 load(byte)和loads(byte)是反序列化

import pickle

dict1 = {'a': 1, 'b': 2}
dict2 = pickle.dumps(dict1)
print(dict2,type(dict2),id(dict2))
dict3 = pickle.loads(dict2)
print(dict3,type(dict3),id(dict3))

D:\python\Python36\python.exe E:/demo/-python-/handlers/test.py b'\x80\x03}q\x00(X\x01\x00\x00\x00aq\x01K\x01X\x01\x00\x00\x00bq\x02K\x02u.' <class 'bytes'> 1536157390816 {'a': 1, 'b': 2} <class 'dict'> 1536043176080

输出结果可以看出两者在内存中的地址并不相同,原因是我们在将字典序列化后,字典调用结束确实在内存中释放了,而反序列化后又从磁盘中取出并在内存中重新划分了一块内存,因此地址显示不同。

dump和load是序列化和反序列化到文件中去

import pickle
import os

dict1 = {'a': 1, 'b': 2}
file = open(os.path.join(os.path.abspath('.'), '1.txt'), 'wb')
dict2 = pickle.dump(dict1, file)
file.close()
print(dict2, type(dict2), id(dict2))
file1 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'rb')
dict3 = pickle.load(file1)
file1.close()
print(dict3, type(dict3), id(dict3))

None <class 'NoneType'> 1805423824 {'a': 1, 'b': 2} <class 'dict'> 2622050204264

3.2 json模块

json.dumps:将python格式转化为json的字符串形式 json.loads:将json的字符串格式转换为python的数据格式

import json

dict1 = {'a': 1, 'b': 2}
dict2 = json.dumps(dict1)
print(dict2, type(dict2), id(dict2))
dict3 = json.loads(dict2)
print(dict3, type(dict3), id(dict3))

{"a": 1, "b": 2} <class 'str'> 2040970141536 {'a': 1, 'b': 2} <class 'dict'> 2040937894392

json.dump:序列化到文件中 json.load: 将文件中的内容反序列化

import os

dict1 = {'a': 1, 'b': 2}
file1 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'w')
dict2 = json.dump(dict1, file1)
file1.close()
print(dict2, type(dict2), id(dict2))
file2 = open(os.path.join(os.path.abspath('.'), '1.txt'), 'r')
dict3 = json.load(file2)
print(dict3, type(dict3), id(dict3))

None <class 'NoneType'> 1805423824 {'a': 1, 'b': 2} <class 'dict'> 1907991182648

参考:blog.csdn.net/reuxfhc/art… blog.csdn.net/u012993796/…