卡夫卡协议:C++;java序列化 我已经开发了一些C++应用程序,它们生成并使用卡夫卡消息(使用CPPkAFKA)嵌入ToBuff3消息。两者都很好。生产商的相关代码为: std::string kafkaString; cppkafka::MessageBuilder *builder; ... solidList->SerializeToString(&kafkaString); builder->payload(kafkaString);

卡夫卡协议:C++;java序列化 我已经开发了一些C++应用程序,它们生成并使用卡夫卡消息(使用CPPkAFKA)嵌入ToBuff3消息。两者都很好。生产商的相关代码为: std::string kafkaString; cppkafka::MessageBuilder *builder; ... solidList->SerializeToString(&kafkaString); builder->payload(kafkaString);,java,c++,apache-kafka,protocol-buffers,kafka-consumer-api,Java,C++,Apache Kafka,Protocol Buffers,Kafka Consumer Api,Protobuf对象被序列化为字符串并作为Kafka负载插入。到目前为止,一切正常。现在,我正试图用Java开发一个消费者。相关代码应为: KafkaConsumer<Long, String> consumer=new KafkaConsumer<Long, String>(properties); .... ConsumerRecords<Long, String> records = consumer.poll(100); for (Consumer

Protobuf对象被序列化为字符串并作为Kafka负载插入。到目前为止,一切正常。现在,我正试图用Java开发一个消费者。相关代码应为:

KafkaConsumer<Long, String> consumer=new KafkaConsumer<Long, String>(properties);
....
ConsumerRecords<Long, String> records = consumer.poll(100);
  for (ConsumerRecord<Long, String> record : records) {
    SolidList solidList = SolidList.parseFrom(record.value());
    ...
现在,错误发生在执行时:线程“main”com.google.protobuf.InvalidProtocolBufferException$InvalidWireTypeException中的异常:协议消息标记的导线类型无效。

BooToFF文档状态说明C++序列化:bool SerializeToString(字符串输出)const;序列化消息并将字节存储在给定字符串中请注意,字节是二进制的,而不是文本;我们仅将string类用作方便的容器。*

TL;DR:因此,我应该如何解释java中的原BuffC++“二进制字节”? 这似乎相关(相反),但无助于:


提前感谢。

您可以通过
消费者记录来阅读卡夫卡。然后
SolidList.parseFrom(ByteBuffer.wrap(record.value().getBytes(“UTF-8”))

尝试实现一个,并将其作为值反序列化器传递给构造函数。它可能是这样的:

class SolidListDeserializer implements Deserializer<SolidList> {
  public SolidList deserialize(final String topic, byte[] data) {
    return SolidList.parseFrom(data);
  }
  ...
}

...

KafkaConsumer<Long, SolidList> consumer = new KafkaConsumer<>(props, new LongDeserializer(), new SolidListDeserializer())
类SolidListDeserializer实现反序列化程序{
public SolidList反序列化(最终字符串主题,字节[]数据){
返回SolidList.parseFrom(数据);
}
...
}
...
KafkaConsumer consumer=新KafkaConsumer(道具、新LongDeserializer()、新SolidListDeserializer())

我想我已经试过了:线程“main”com.google.protobuf.InvalidProtocolBufferException中出现异常:协议消息包含无效标记(零)。太棒了!它起作用了!(反序列化程序是必需的,我在前面的评论中犯了错误);谢谢,这就成功了。和平9分钟前的鲁道夫
    SolidList solidList = SolidList.parseFrom(record.value().getBytes());
class SolidListDeserializer implements Deserializer<SolidList> {
  public SolidList deserialize(final String topic, byte[] data) {
    return SolidList.parseFrom(data);
  }
  ...
}

...

KafkaConsumer<Long, SolidList> consumer = new KafkaConsumer<>(props, new LongDeserializer(), new SolidListDeserializer())