Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么kafka中有多个反序列化程序,比如string、byte和short?_Java_Scala_Apache Kafka_Streaming - Fatal编程技术网

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??