为什么kafka中有多个反序列化器,如string、byte、short?

Why are there multiple deserializers in kafka like string,byte, short?

val consumer: KafkaConsumer[Bytes, Bytes] = kafkaConsumer(config,new BytesDeserializer,new BytesDeserializer)
consumer.subscribe(util.Arrays.asList("fruits"))
while (true){
  val incoming = consumer.poll(1000)
  incoming.asScala.foreach(x=>println(x.value()))
}

同样使用字符串反序列化器给出相同的输出

val consumer: KafkaConsumer[String, String] = kafkaConsumer(config,new StringDeserializer,new StringDeserializer) 

在您的特定情况下,这取决于字符串的编码方式。

例如:

scala> val testStr = "TestStringą"
testStr: String = TestStringą
scala> testStr.getBytes("ISO-8859-2")
res6: Array[Byte] = Array(84, 101, 115, 116, 83, 116, 114, 105, 110, 103, -79)
scala> testStr.getBytes("UTF-8")
res7: Array[Byte] = Array(84, 101, 115, 116, 83, 116, 114, 105, 110, 103, -60, -123)
scala> testStr.getBytes("UTF-16")
res8: Array[Byte] = Array(-2, -1, 0, 84, 0, 101, 0, 115, 0, 116, 0, 83, 0, 116, 0, 114, 0, 105, 0, 110, 0, 103, 1, 5)

如何查看,取决于字符集编码二进制表示的不同。

StringDeserializer 使用 UTF-8,因此如果您的字符串使用 UTF-16 编码并发送到 Kafka 主题,StringDeserializer 会将其解码为:

scala> val v = new String(res8, "UTF-8")
v: String = ��?T?e?s?t?S?t?r?i?n?g??

这不是你想要的。

你必须记住使用兼容的解串器和序列化器。 每个 Deserializer/Serializer 专用于特定类型 - String、Long、Short Bytes、Custom 等。 这些类型中的每一种都以不同的方式表示 - 例如。具有不同的长度、编码等