Java 为什么kafka中有多个反序列化程序,比如string、byte和short?
同样,使用字符串反序列化器也会给出相同的输出Java 为什么kafka中有多个反序列化程序,比如string、byte和short?,java,scala,apache-kafka,streaming,Java,Scala,Apache Kafka,Streaming,同样,使用字符串反序列化器也会给出相同的输出 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.asScal
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)
如何看,取决于字符集编码的二进制表示法是不同的
StringDeserializer
使用UTF-8
,因此如果您的字符串使用UTF-16
编码并发送到Kafka topic,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)
这不是你想要的
您必须记住使用兼容的反序列化程序和序列化程序。
每个反序列化器/序列化器专用于特定类型-字符串、长字节、短字节、自定义等。
这些类型中的每一种都有不同的表示——例如,具有不同的长度、编码等
scala> val v = new String(res8, "UTF-8")
v: String = ��?T?e?s?t?S?t?r?i?n?g??