是否可以使用元类/反射从 python 中的 udp 套接字收到的消息中提取对象类型或类名?
场景是这样的:
在套接字上接收 udp 缓冲区。
UDP 缓冲区是一个序列化的二进制字符串(消息)。但目前尚不清楚消息的类型。因此无法反序列化为适当的消息。
现在,我的问题是我能否知道序列化二进制字符串(recvd 作为 UDP 缓冲区)的类名,以便我可以反序列化为适当的消息并进一步处理。
提前致谢。
最佳答案
您从 udp 套接字收到的是一个字节字符串——这就是实际上那里的所有“对象类型或类名”。如果字节字符串被构建为序列化对象(例如通过 pickle
或 marshal
等),那么您可以将其反序列化回对象(例如使用 pickle .loads
),然后然后反省你内心的内容。但大多数字节字符串都是以其他方式构建的,并且当您尝试从中加载
时会引发异常;-)。
编辑:OP的编辑提到该字符串是“序列化对象”,但仍然没有说明是什么序列化方法产生了它,这使得一切都不同。 pickle
(对于范围更窄的 marshal
类型),在它们生成的字符串上放置足够的信息(通过模块的 .dumps
函数) )它们各自的 loads
函数可以反序列化回适当的类型;但其他方法(例如,struct.pack)不会将此类元数据放入它们生成的字符串中,因此如果没有其他“带外”格式指示,则反序列化是不可行的正在使用。那么,O.P.,最初是如何生成序列化的字节字符串的......?
关于python - 使用元类/反射的 python 中 udp 缓冲区的对象类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1487582/