簡體   English   中英

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

[英]Deserializing Java org.apache.kafka.common.serialization serialized objects with Python

我有一個 Java Kafka 生產者,它使用org.apache.kafka.common.serialization.LongSerializer作為關鍵序列化程序,我正在嘗試使用 Python Kafka 消費者來消費來自主題的消息。

我認為由於LongSerializerorg.apache.kafka一部分,因此所有其他語言的官方 Kafka 客戶端都可以使用等效的序列化器和反序列化器,以促進互操作性。 但是,我找不到它。

那么,人們是否應該僅將org.apache.kafka.common.serialization用於純 JVM 的項目,還是有其他方法可以使用 Python 反序列化這些對象?

我覺得我錯過了一些東西,因為我發現很難相信 Kafka 提供了開箱即用的序列化器和反序列化器,它們不會促進用不同語言編寫的進程之間的通信......

如果有人在被問到一年后仍然需要答案,您可以在 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM