Protobuf Java到C++序列化[二进制]

Ove*_*olt 0 java binary parsing protocol-buffers

我有一个程序,用Java中的Protobuf序列化数据,在byte [] Array中写入二进制数据,然后将其保存在".txt"文件中.我在字符串流中接收C++端的数据.现在我想用C++解析那个二进制数据,但是Protobuf-Parsing-Method"parseFromString()"不起作用!我的测试消息中的字段未设置.我为此写了一个小测试,我可以给你看一些代码:

Java序列化

  byte[] s = test.build().toByteArray(); //This is serialized to "C:\test.txt" as binary
Run Code Online (Sandbox Code Playgroud)

C++解析:

Test t1; // My Protobuf Message
std::ifstream myFile("C:\\test.txt");
std::string s;
myFile >> s;

t1.ParseFromString(s);
std::cout << "Decoded: " << t2.s() << std::endl; // Check if parsing was correct
Run Code Online (Sandbox Code Playgroud)

但它只是返回:"解码:",好像t2是空的,但它不应该!如何用C++解析二进制数据?

Ken*_*rda 5

你的问题可能在这里:

myFile >> s;
Run Code Online (Sandbox Code Playgroud)

>>运营商读取文本字符串,用空格分隔.编码的protobuf不是文本.可能ParseFromString()是返回false表示它无法解析数据,因为它不完整.

你想要做的是阅读整个文件.在您的情况下,最简单的方法是使用ParseFromIstream(&myFile).(并确保检查它是否返回true!)

(另一个选择是检查文件大小,创建一个大小的数组,使用myFile.read(array, size),然后ParseFromArray(array, size),但这将是更多的工作,将做同样的事情.)

请注意,您可能不应将其.txt用作protobuf的文件扩展名,因为该文件不包含文本.

另请注意,令人困惑的是,在C++中,您可以将二进制(非文本)数据放入std::string- 它只是一个字节容器 - 但在Java中,您不能将二进制数据放入String.所以C++ ParseFromString()SerializeAsString()处理二进制数据,而Java toString()实际上返回消息的文本表示(用于调试目的),这不是你想要传输的.