Python pickle,网络数据传输就得这么玩

目录

1、基础使用:pickle.dump() 📁

1.1 序列化对象到文件

1.2 从文件加载序列化对象

2、高级技巧:pickle.dumps() 🔄

2.1 将对象转换为字节流

2.2 字节流在网络间传输对象

3、安全考虑:protocol参数选择 🔒

3.1 不同协议版本介绍

3.2 选择合适的序列化协议

3.3 解析攻击与安全限制

3.4 使用pickletools.dis检查安全性

4、大型数据分块处理 💾

4.1 文件过大处理策略

4.2 分块读写与重组对象

5、持久化复杂对象 💾

5.1 数据库字段序列化存储

5.2 分布式任务队列中的消息封装

6、进阶替代:json vs. pickle 🔍

6.1 适用场景对比

6.2 性能与兼容性考量

7、总结与注意事项 🗒️



1、基础使用:pickle.dump() 📁

1.1 序列化对象到文件

当需要将Python中的复杂对象结构保存至磁盘,以便于后续加载或跨进程共享时,pickle模块便派上用场了。pickle.dump()函数用于将一个Python对象序列化并写入到文件中,这样即使程序关闭后,对象的状态也能得以保存。

示例代码:

import pickle

# 创建一个字典作为示例对象
data = {'name': 'Alice', 'age': 30, 'city': 'New York'}

# 打开一个文件用于写入
with open('data.pickle', 'wb') as file:
    # 使用pickle.dump()序列化并写入数据
    pickle.dump(data, file)

print("Data has been successfully pickled.")

运行输出:

Data has been successfully pickled.

1.2 从文件加载序列化对象

一旦对象被序列化并保存至文件 ,我们可以通过pickle.load()函数来反序列化这个对象 ,重新在内存中创建出原对象。

示例代码:

# 重新打开之前保存的文件
with open('data.pickle', 'rb') as file:
    # 使用pickle.load()从文件中加载数据
    loaded_data = pickle.load(file)

print(loaded_data)

运行输出:

{'name': 'Alice', 'age': 30, 'city': 'New York'}

通过这种方式,不仅字典可以被序列化 ,包括自定义类的实例、列表、元组等复杂的数据结构也同样适用,这极大地提高了数据持久化的灵活性和便利性。务必注意,由于pickle模块的序列化机制可能包含执行任意Python代码的风险,因此在处理不可信来源的数据时应当格外小心,避免潜在的安全威胁。在确保安全性的前提下,合理运用pickle模块能够显著提升数据处理的工作效率。

2、高级技巧:pickle.dumps() 🔄

2.1 将对象转换为字节流

在处理网络通信或存储限制严格的场景下,直接操作对象的字节表示形式显得尤为重要。pickle.dumps()方法能够将Python对象转换成字节流(即二进制格式),这对于需要在网络间高效传递对象或在特定存储介质上紧凑存放数据时非常有用。

示例代码:

import pickle

# 创建一个复杂的字典对象作为例子
example_dict = {'key1': [1, 2, 3], 'key2': {'nested_key': 'value'}, 'key3': (True, False)}

# 使用pickle.dumps将对象转换为字节流
byte_stream = pickle.dumps(example_dict)

print(f"原始字典的字节流表示: {byte_stream}")

2.2 字节流在网络间传输对象

将对象转换为字节流后,就可以方便地在网络间传输这些数据。这在分布式系统、微服务架构或客户端-服务器模型中尤为常见。下面是一个简单的模拟过程 ,展示如何在网络套接字(socket)中使用序列化后的字节流。

示例代码(模拟网络传输):

import socket

# 假设这是服务器端发送数据
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 12345))
server_socket.listen()

client_socket, addr = server_socket.accept()
print(f"连接来自: {addr}")

# 发送序列化后的字节流
client_socket.sendall(byte_stream)

# 关闭连接
client_socket.close()
server_socket.close()

# 客户端接收并反序列化数据
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

received_data = b''
while True:
    chunk = client_socket.recv(1024)
    if not chunk:
        break
    received_data += chunk

client_socket.close()

# 反序列化回原来的对象
received_dict = pickle.loads(received_data)

print(f"客户端接收并反序列化的字典: {received_dict}")

请注意,上述网络通信部分仅为示例,实际应用中需要考虑错误处理、连接管理等更多细节。通过这样的方式,pickle.dumps()pickle.loads()配合使用,使得对象在网络间高效且无损地传输成为可能,极大地扩展了Python数据处理的边界。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图灵学者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值