【语法】序列化与反序列化
详解Python中的序列化(简单易懂版)_python 序列化-CSDN博客
python序列化与反序列化_python序列化和反序列化-CSDN博客
【背景】
序列号是一个将数据结构或对象状态转换为可存储或传输的格式(如JSON、XML、二进制等)的过程。反序列化(Deserialization)则是这个过程的逆操作,即将存储或传输的格式转换回原始的数据结构或对象状态
文件只能存储字符串和字节流
json 主要应用于传输数据 , 序列化成字符串
pickle 主要应用于存储数据 , 序列化成二进制字节流
【优点】
- 持久化存储:
- 序列化可以将对象保存到文件或数据库中,以便在程序重新启动时能够恢复对象的状态。这对于需要持久化存储数据的应用程序(如数据库系统、配置文件等)非常重要。
- 网络传输:
- 序列化可以将对象转换为可以在网络上传输的格式(如JSON、XML),从而实现分布式系统中的数据交换。这对于客户端-服务器架构、微服务架构等分布式系统尤为重要。
- 数据交换:
- 序列化使得不同编程语言或系统之间可以交换数据。例如,一个Python程序可以将数据序列化为JSON格式,然后另一个用Java或JavaScript编写的程序可以读取并反序列化这些数据。
- 缓存:
- 序列化可以将对象状态保存到缓存中,以减少计算时间。例如,一个复杂的计算结果可以被序列化并存储到缓存中,下次需要时可以直接从缓存中读取并反序列化,而无需重新计算。
- 日志记录:
- 序列化可以将对象状态记录到日志文件中,以便进行调试和审计。这对于跟踪程序执行过程中的状态变化非常有用。
【序列化、反序列化的方式】
json
缺点:不支持高级数据类型,只支持 TypeError: keys must be str, int, float, bool1 or None, not datetime
1 # 导入json模块 2 import json 3 4 simple_dict = {'name': 'zxy', 'age': 21} 5 with open('simple_dict.txt', 'w') as file_to_write: 6 # 进行json序列化,然后写入simple_dict.txt文件中 7 json.dump(simple_dict, file_to_write) 8 9 10 with open('simple_dict.txt', 'r') as file_to_read: 11 loaded_simple_dict = json.load(file_to_read) 12 print(loaded_simple_dict) 13 print(type(loaded_simple_dict))
# 可以使用indent=4 参数来对json进行数据格式化输出,会根据数据格式缩# 进显示,读起来更加清晰 import json data = [{"name":"张","age":20},{"name":"王","age":21}] json_str=json.dumps(data, indent=4, ensure_ascii=False) print(json_str) #separators=(',', ':') dumps出来的字典 值的前面不带空格
Pickle
可以转化大多数 Python 的数据类型,并且储存方式是二进制(Byte Code)。二进制的储存方式只有机器才能理解,但是同时也保证了一定的数据隐秘性和高效性。
1 import pickle 2 import datetime 3 abc_dict = {datetime.datetime(2019, 7, 18, 0, 0): 9682.24, 4 datetime.datetime(2019, 7, 17, 0, 0): 9411.61, 5 datetime.datetime(2019, 7, 16, 0, 0): 10858.7, 6 datetime.datetime(2019, 7, 15, 0, 0): 10195.0, 7 datetime.datetime(2019, 7, 14, 0, 0): 11378.23, 8 datetime.datetime(2019, 7, 13, 0, 0): 11810.0, 9 datetime.datetime(2019, 7, 12, 0, 0): 11338.9, 10 datetime.datetime(2019, 7, 11, 0, 0): 12090.99, 11 datetime.datetime(2019, 7, 10, 0, 0): 12577.85} 12 13 with open('abc.pk', 'wb') as file_to_write: 14 pickle.dump(abc_dict, file_to_write) 15 16 17 import pickle 18 import datetime 19 abc_dict = {datetime.datetime(2019, 7, 18, 0, 0): 9682.24, 20 datetime.datetime(2019, 7, 17, 0, 0): 9411.61, 21 datetime.datetime(2019, 7, 16, 0, 0): 10858.7, 22 datetime.datetime(2019, 7, 15, 0, 0): 10195.0, 23 datetime.datetime(2019, 7, 14, 0, 0): 11378.23, 24 datetime.datetime(2019, 7, 13, 0, 0): 11810.0, 25 datetime.datetime(2019, 7, 12, 0, 0): 11338.9, 26 datetime.datetime(2019, 7, 11, 0, 0): 12090.99, 27 datetime.datetime(2019, 7, 10, 0, 0): 12577.85} 28 29 with open('abc.pk', 'wb') as file_to_write: 30 # pickle序列化,然后以二进制的形式存入文件中 31 pickle.dump(abc_dict, file_to_write) 32 33 with open('abc.pk', 'rb') as file_to_read: 34 # 以二进制的形式进行读取文件 35 abc_dict_pk = pickle.load(file_to_read) 36 print(abc_dict_pk) 37 print(type(abc_dict_pk))
XML
虽然Python标准库没有直接提供XML序列化的模块,但可以使用第三方库(如xml.etree.ElementTree或lxml)来实现XML的序列化和反序列化。
区别
但是本质上 Json 写入文件的是字符串,而 Pickle 则是把数据转化成了二进制,两个是完全不同的处理方案。
json 连续dump数据 , 但是不能连续load数据 , 是一次性获取所有内容进行反序列化.
1 dic1 = {"a":1,"b":2} 2 dic2 = {"c":3,"d":4} 3 with open("lianxi4.json",mode="w",encoding="utf-8") as fp: 4 json.dump(dic1,fp) 5 fp.write("\n") 6 json.dump(dic2,fp) 7 fp.write("\n")
(1)json序列化之后的数据类型是str,所有编程语言都识别,
但是仅限于(int float bool)(str list tuple dict None)
json不能连续load,只能一次性拿出所有数据
(2)pickle序列化之后的数据类型是bytes,用于数据存储
所有数据类型都可转化,但仅限于python之间的存储传输.
pickle可以连续load,多套数据放到同一个文件中
pickle自己用可以,用的前提是大家都支持pickle
浙公网安备 33010602011771号