1、序列化和反序列化
序列化 (Serialization)是将对象的信息转换为可以存储或传输的形式的过程,如数据对象转成文本。反序列化是将序列化后的文本内容在还原成对象。也就是序列化后的格式的内容解析成对象的过程。一般比较常用的是json模块,可以将数据对象序列化成json格式字符串,然后在网络传输或持久化保存。需要使用时,在将传输后的字符串或持久化保存的字符串,反序化成对象。
2、pickle的序列化和反序列化方法(dump()、dumps()、load()和loads())
pickle
模块的序列化的方法为pickle.dump()
和pickle.dumps()
,反序列化方法为pickle.load()
和pickle.loads()
。
参考文档:https://docs.python.org/3/library/pickle.html
1)dump()方法
pickle.dump(obj, file, protocol=None,*,fix_imports=True)
实现的是将序列化后的对象obj以二进制形式写入文件file中,进行保存。
2)dumps()方法
pickle.dumps(obj, protocol=None,*,fix_imports=True)
pickle.dumps()
方法跟 pickle.dump()
方法的区别在于,pickle.dumps()
方法不需要写入文件中,它是直接返回一个序列化的bytes对象。
3)load()方法
pickle.load(file, *,fix_imports=True, encoding="ASCII". errors="strict")
实现的是从文件中读取反序列化后的二进制形式字符串反序化成对象。pickle.dump()对应的就是pickle.load()方法。
4)loads()方法
pickle.loads(bytesobject, *,fiximports=True, encoding="ASCII". errors="strict")
pickle.loads()
方法跟 pickle.load()
方法的区别在于,pickle.loads()
方法是直接从bytes对象中读取序列化的信息,而非从文件中读取。
5)使用示例
import pickle
data=['C', 'Java', 'Python']
#pickle.dump()和pickle.load()
# 打开一个文件,在那里你要存储数据
file1 = open('cjavapy.db', 'wb')
# 将信息转储到该文件中
pickle.dump(data, file1)
# 关闭文件
file1.close()
# 打开一个存储pickle数据的文件
file2 = open('cjavapy.db', 'rb')
# 从文件加载存储的数据
data = pickle.load(file2)
# 关闭文件
file2.close()
for item in data:
print('item = ', item)
#pickle.dumps()和pickle.loads()
#序列化
result = pickle.dumps(data)
print(result)
#反序化
print(pickle.loads(result),type(pickle.loads(result)))
3、json的序列化和反序列化方法(dump()、dumps()、load()和loads())
json模块的序列化的方法为json.dump()
和json.dumps()
,反序列化方法为json.load()
和json.loads()
。
参考文档:https://docs.python.org/3/library/json.html
1)dump()方法
json.dump(file, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
实现的是将序列化后的对象obj以jjson格式字符串写入文件file中,进行保存。
2)dumps()方法
json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, encoding="utf-8", default=None, sort_keys=False, **kw)
json.dumps()
方法跟 pickle.dump()
方法的区别在于,json.dumps()
方法不需要写入文件中,它是直接返回一个序列化的json字符串对象。
3)load()方法
json.load(file [, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
实现的是从文件中读取反序列化后的json字符串反序化成对象。json.dump()
对应的就是json.load()
方法。
4)loads()方法
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
json.loads()
方法跟 json.load()
方法的区别在于,json.loads()
方法是直接从json格式字符串中读取序列化的信息,而非从文件中读取。
5)使用示例
import json
data=['C', 'Java', 'Python']
#json.dump()和json.load()
# 打开一个文件,在那里你要存储数据
file1 = open('cjavapy.db', 'wt')
# 将信息转储到该文件中
json.dump(data, file1)
# 关闭文件
file1.close()
# 打开一个存储json数据的文件
file2 = open('cjavapy.db', 'rb')
# 从文件加载存储的数据
data = json.load(file2)
# 关闭文件
file2.close()
for item in data:
print('item = ', item)
#json.dumps()和json.loads()
#序列化
result = json.dumps(data)
print(result)
#反序化
print(json.loads(result),type(json.loads(result)))