【语法】序列化与反序列化

详解Python中的序列化(简单易懂版)_python 序列化-CSDN博客

python序列化与反序列化_python序列化和反序列化-CSDN博客

【背景】

序列号是一个将数据结构或对象状态转换为可存储或传输的格式(如JSON、XML、二进制等)的过程。反序列化(Deserialization)则是这个过程的逆操作,即将存储或传输的格式转换回原始的数据结构或对象状态

文件只能存储字符串和字节流

json 主要应用于传输数据 , 序列化成字符串

pickle 主要应用于存储数据 , 序列化成二进制字节流

【优点】

  1. 持久化存储:
    • 序列化可以将对象保存到文件或数据库中,以便在程序重新启动时能够恢复对象的状态。这对于需要持久化存储数据的应用程序(如数据库系统、配置文件等)非常重要。
  2. 网络传输:
    • 序列化可以将对象转换为可以在网络上传输的格式(如JSON、XML),从而实现分布式系统中的数据交换。这对于客户端-服务器架构、微服务架构等分布式系统尤为重要。
  3. 数据交换:
    • 序列化使得不同编程语言或系统之间可以交换数据。例如,一个Python程序可以将数据序列化为JSON格式,然后另一个用Java或JavaScript编写的程序可以读取并反序列化这些数据。
  4. 缓存:
    • 序列化可以将对象状态保存到缓存中,以减少计算时间。例如,一个复杂的计算结果可以被序列化并存储到缓存中,下次需要时可以直接从缓存中读取并反序列化,而无需重新计算。
  5. 日志记录:
    • 序列化可以将对象状态记录到日志文件中,以便进行调试和审计。这对于跟踪程序执行过程中的状态变化非常有用。

【序列化、反序列化的方式】

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.ElementTreelxml)来实现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

posted on 2025-01-06 20:00  张凌赫_帅  阅读(65)  评论(0)    收藏  举报

导航