【发布时间】:2011-08-05 23:01:49
【问题描述】:
我的问题是在 C++ 中序列化 protobuf 数据并在 Java 中反序列化数据。 这是我对dcn给出的提示使用的代码:
有了这个,我在 C++ 中创建了 protobuf 数据并将其写入通过套接字发送的 ostream。
Name name;
name.set_name("platzhirsch");
boost::asio::streambuf b;
std::ostream os(&b);
ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
coded_output->WriteLittleEndian32(name.ByteSize());
name.SerializeToCodedStream(coded_output);
socket.send(b);
这是我尝试解析它的 Java 端:
NameProtos.Name name = NameProtos.Name.parseDelimitedFrom(socket.getInputStream());
System.out.println(name.newBuilder().build().toString());
但是,我得到了这个异常: com.google.protobuf.UninitializedMessageException:消息缺少必填字段:名称
我错过了什么?
有缺陷的代码行是:name.newBuilder().build().toString()
这永远不会奏效,使用未初始化的名称字段创建了一个新实例。无论如何,这里的答案解决了我剩下的问题。
最后一件事,我在 protobuf 邮件列表中被告知:为了刷新 CodedOutputStreams,必须删除对象!
delete coded_output;
delete raw_output;
【问题讨论】:
-
填充接收到的数组的代码是什么样的?
-
尝试打印出“message.SerializeAsString()”和“received”的结果,看看它们是否相同。
-
@jtahlborn 我在更新的问题中描述了它。请看一看。
-
@Kannan-Goundan 他们是。另请参阅我修改后的问题。
-
这不是 \0(字符串结尾)标记?
标签: java c++ protocol-buffers