我的問題是序列化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