代码之家  ›  专栏  ›  技术社区  ›  Anonymous

python中udp缓冲区中使用元类/反射的对象类型

  •  1
  • Anonymous  · 技术社区  · 15 年前

    是否可以使用元类/反射从python中udp套接字接收的消息中提取对象或类名的类型?

    场景如下:

    1. UDP缓冲区是序列化的二进制字符串(消息)。但目前还不知道消息的类型。因此无法反序列化为适当的消息。

    提前谢谢。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Alex Martelli    15 年前

    从udp套接字接收到的是一个字节字符串——实际上就是所有的“对象类型或类名” . 如果字节字符串是作为序列化对象生成的(例如,通过 pickle ,或者 marshal 等),然后可以将其反序列化回对象(使用。 pickle.loads )以及 反省你内心的满足。但是大多数字节字符串是以其他方式构建的,当您尝试 loads

    编辑 泡菜 (对于更窄的类型范围 元帅 .dumps 各模块的功能 荷载 函数可以反序列化回适当的类型;但是其他方法(例如。, struct.pack )不要将这样的元数据放在它们生成的字符串中,这样就不可能在没有其他“带外”的情况下反序列化,也就是说,在使用中的格式指示的情况下反序列化。所以,o.P。, 怎样 是不是一开始就产生了序列化的字节串。。。?

        2
  •  0
  •   Ned Batchelder    15 年前

    您需要使用序列化模块。 pickle marshal 都是选择。它们提供了将对象转换为bytestream并再次返回的函数。

        3
  •  0
  •   Lennart Regebro    15 年前

    “但目前还不知道消息的类型。因此无法反序列化为适当的消息。”

    你得到的是一个字节序列。如何解释类型序列是协议的外观问题。只有你知道你用什么协议。所以如果你不知道信息的类型,那你就无能为力了。如果要接收数据流并对其进行解释,则必须知道该数据的含义,否则无法对其进行解释。

    就这么简单。

    现在,我的问题是我能知道序列化的二进制字符串的类名吗

    对。与所有字符串一样,类名是“str”。(除非您使用Python 3,在这种情况下,您将不会得到str,而是得到一个二进制文件)。str中的数据没有类名。只是二进制数据。它意味着发送者想表达的任何意思。

    再说一遍,我需要强调的是,你不应该试图把这个问题变成一个普通的问题。准确地解释你想做什么,不是一般的,而是具体的。