使用Python反序列化Java org.apache.kafka.common.serialization序列化的对象

时间:2019-06-17 05:27:27

标签: java python serialization apache-kafka

我有一个Java Kafka生产者,它使用org.apache.kafka.common.serialization.LongSerializer作为键序列化程序,并且我正尝试使用Python Kafka使用者来消耗主题消息。

我认为,由于LongSerializerorg.apache.kafka的一部分,因此在所有其他语言的Kafka官方客户端中都可以使用等效的序列化器和反序列化器,以促进互操作性。但是,我找不到它。

那么,人们应该只对纯JVM的项目使用org.apache.kafka.common.serialization吗?还是有其他方法可以使用Python反序列化这些对象?

我觉得我缺少了一些东西,因为我很难相信Kafka提供了开箱即用的序列化器和反序列化器,它们并不能促进以不同语言编写的进程之间的通信...

1 个答案:

答案 0 :(得分:0)

如果在问了一年后仍然有人需要答案,则可以在Python中重新实现Java的LongSerializer:

    def long_deserializer(data: bytes):
      if not data:
        return None
      if len(data) != 8:
        raise Exception(f"Size of data received by long_deserializer is not 8. Received {len(data)}")

      # 0xF...FFFFFFFF is always -1
      if data == b'\xff\xff\xff\xff\xff\xff\xff\xff':
        return -1

      value = 0
      for b in data:
        value <<= 8
        value |= b & 0xFF

      return value

示例用法如下:

  • 输入:

b'\x00\x00\x00\x00\x00\x00\x04\xd2

  • 解码部分:

x04\xd2

  • 解码为二进制:

0x04=100, d=1010 , 2=0010

  • 结果:

10010100010

  • 转换为int(返回值):

10010100010 = 1234

此外,如果您想采用更“ pythonic”的方式,则可以使用内置函数:

int('0x' + data.hex().lstrip('0'), 0)