Python中使用Pickle传输对象:UDP服务端如何获取Point对象?
解决UDP传输中Point对象反序列化的问题
哦,我太懂你现在的困惑了!你看到的那串看起来乱糟糟的字节数据,其实是Python的pickle模块把你的Point对象序列化后的产物——简单说就是把对象转成了能在网络上传输的字节流。要把它变回你熟悉的Point对象,只需要做反序列化操作就行啦。
具体步骤如下:
确保服务端有Point类的定义
反序列化需要知道Point类的结构,所以服务端必须和客户端一样,有完整的Point类定义,或者从对应模块导入这个类。比如:class Point: def __init__(self, x, y): self.x = x self.y = y用pickle.loads()解析字节数据
服务端接收到数据后,把收到的字节流传给pickle.loads()方法,就能直接还原出Point对象了。给你个完整的服务端示例:import pickle import socket # 先定义Point类,或者从其他文件导入 class Point: def __init__(self, x, y): self.x = x self.y = y # 初始化UDP服务端 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('127.0.0.1', 5555)) # 绑定你自己的端口 print("UDP服务端已启动,等待数据...") while True: raw_data, client_addr = server_socket.recvfrom(1024) # 反序列化得到Point对象 point_obj = pickle.loads(raw_data) # 现在就可以正常使用这个对象了 print(f"收到来自{client_addr}的Point对象: x={point_obj.x}, y={point_obj.y}")
重要提醒:
- 客户端那边肯定是用
pickle.dumps()把Point对象转成字节流发送的,服务端必须用对应的pickle.loads()来解析,二者要配对。 - 务必保证服务端和客户端的
Point类定义完全一致(类名、属性名、结构都不能变),不然反序列化会抛出错误。 pickle虽然好用,但要注意安全:绝对不要反序列化来自不可信来源的数据,因为它可能会执行恶意代码哦。
内容的提问来源于stack exchange,提问作者tony9099
相关产品推荐
相关产品推荐

