我的问题是序列化C++中的protobuf数据并可能反序列化Java中的数据。 下面是我使用dcn提供的提示的代码:无法从Java中的C++反序列化protobuf数据
用这个,我在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;
你的代码是什么样子填充接收的数组? – jtahlborn 2011-04-15 00:33:48
尝试打印出“message.SerializeAsString()”和“received”的结果并查看它们是否相同。 – 2011-04-15 01:12:15
@jtahlborn我在我更新的问题中描述了它。请看一看。 – 2011-04-15 09:04:36