目 录CONTENT

文章目录

Python:序列化和反序列化,JSON

Administrator
2025-10-28 / 0 评论 / 0 点赞 / 0 阅读 / 0 字

 

字数 1257,阅读大约需 7 分钟

Python:序列化和反序列化,JSON


什么是序列化和反序列化

凡是需要进行“跨平台存储”和”网络传输”的数据,都需要进行序列化。存储和网络传输 都需要经过 把一个对象状态保存成一种跨平台识别的字节格式,然后其他的平台才可以通过字节信息解析还原对象信息。

  1. 1. 序列化:将数据结构或对象转换成二进制字节流的过程

  2. 2. 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程

总之:序列化是将对象转换为字节序列的过程,用于存储或传输;反序列化则是将字节序列转换回对象的逆过程序列化和反序列化 - 美团技术团队[1]

Python的序列化和反序列化

Python的序列化是将Python对象(如列表、字典、类的实例)转换为字节流(或其他可存储、传输的格式)的过程,而反序列化是反向过程,将字节流还原为Python对象。这通常用于数据持久化(存储到文件)和网络传输。在Python中,常用的方法是使用pickle模块(处理Python对象)和json模块(处理数据交换格式)

论坛:我创建了一个小项目,用于将 Python 对象与 JSON 之间进行序列化/反序列化。 : r/Python[2]

pickle

pickle官方文档:pickle --- Python 对象序列化 — Python 3.13.9 文档[3]

模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化:

  1. 1. "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,

  2. 2. "unpickling" 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。

Python 有一个更原始的序列化模块称为 marshal,但一般地 pickle 应该是序列化 Python 对象时的首选。marshal 存在主要是为了支持 Python 的 .pyc 文件。对于marshal的缺陷和使用场景,见marshal --- 内部 Python 对象序列化 — Python 3.13.9 文档[4]pickle 格式使用相对紧凑的二进制来存储。如果需要让文件更小,可以高效地 压缩 由 pickle 封存的数据。


    
    
    
  import pickle

# 定义一个自定义类,用于演示复杂对象的序列化
class ComplexObject:
    def __init__(self, name, value, items):
        self.name = name  # 名称
        self.value = value  # 一个整数值
        self.items = items  # 一个包含其他对象的列表

    def display(self):
        # 显示对象内容的方法
        print(f"Name: {self.name}")
        print(f"Value: {self.value}")
        print(f"Items: {self.items}")


# 创建一个复杂对象的实例
complex_data = ComplexObject(
    name="Kilo's Object",
    value=12345,
    items=[1, 'a', {'key': 'value'}]
)


# 将复杂对象序列化到文件
# 'wb' 表示以二进制写模式打开文件
with open('complex_data.pkl', 'wb') as f:
    # 使用pickle.dump将对象写入文件
    pickle.dump(complex_data, f)


# 从文件中反序列化复杂对象
# 'rb' 表示以二进制读模式打开文件
with open('complex_data.pkl', 'rb') as f:
    # 使用pickle.load从文件读取并重建对象
    deserialized_complex_data = pickle.load(f)


# 验证反序列化后的数据
print("Original complex object:")
complex_data.display()

print("\nDeserialized complex object:")
deserialized_complex_data.display()

# 检查反序列化后的对象属性是否与原始对象相同
assert complex_data.name == deserialized_complex_data.name
assert complex_data.value == deserialized_complex_data.value
assert complex_data.items == deserialized_complex_data.items

执行结果


    
    
    
  Original data: {'name': 'Kilo Code', 'version': 1.0, 'features': ['serialization', 'deserialization']}
Deserialized data: {'name': 'Kilo Code', 'version': 1.0, 'features': ['serialization', 'deserialization']}

json

19.2. json — JSON 编码和解码器 — Python 3.6.15 文档[5]
JSON (JavaScript Object Notation),由 RFC 7159 (它取代了 RFC 4627) 和 ECMA-404 进行规范,是一个受到 JavaScript 对象字面值语法启发的轻量级数据交换格式 。
Python使用内置的 json 模块来处理JSON数据,数据对应关系如下


    
    
    
  import json

# 定义一个Python字典对象
# 用于演示JSON序列化
data = {
    "name": "张三",
    "age": 30,
    "isStudent": False,
    "courses": [{"title": "历史", "credits": 3}, {"title": "数学", "credits": 4}],
}

# 序列化:将Python对象(字典)转换为JSON格式的字符串
# indent=4 参数会让JSON字符串带缩进,更易读
# ensure_ascii=False 用来确保中文字符能正常显示
json_string = json.dumps(data, indent=4, ensure_ascii=False)

# 打印序列化后的JSON字符串
print("序列化后的JSON字符串:")
print(json_string)
print("-" * 20)

# 反序列化:将JSON格式的字符串转换回Python对象(字典)
decoded_data = json.loads(json_string)

# 打印反序列化后的Python对象
print("反序列化后的Python对象:")
print(decoded_data)
print("-" * 20)

# 验证数据类型
print("数据类型验证:")
print(f"原始数据类型: {type(data)}")
print(f"序列化后数据类型: {type(json_string)}")
print(f"反序列化后数据类型: {type(decoded_data)}")

# 访问反序列化后的数据
print("\n访问反序列化后的数据:")
print(f"姓名: {decoded_data['name']}")
print(f"第一门课程: {decoded_data['courses'][0]['title']}")

引用链接

[1] 序列化和反序列化 - 美团技术团队: https://tech.meituan.com/2015/02/26/serialization-vs-deserialization.html
[2] 我创建了一个小项目,用于将 Python 对象与 JSON 之间进行序列化/反序列化。 : r/Python: https://www.reddit.com/r/Python/comments/jq6ier/i_created_a_small_project_to_marshallunmarshall/?tl=zh-hans
[3] pickle --- Python 对象序列化 — Python 3.13.9 文档: https://docs.python.org/zh-cn/3.13/library/pickle.html
[4] marshal --- 内部 Python 对象序列化 — Python 3.13.9 文档: https://docs.python.org/zh-cn/3.13/library/marshal.html#module-marshal
[5] 19.2. json — JSON 编码和解码器 — Python 3.6.15 文档: https://docs.python.org/zh-cn/3.6/library/json.html

 

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区