Jay*_*Jay 14 c++ qt types protocol-buffers
我想在Qt开发中深入研究Google的协议缓冲区,但我无法弄清楚如何最好地合并它们.
最终,我想发送QUdpSocket
和QTcpSocket
使用协议缓冲区.
在协议缓冲区之间message
切换到通过套接字(QByteArray
)再发送数据然后再返回另一端的最佳方法是什么?
Vij*_*hew 12
QByteArray
从protobuf对象创建一个:
Person person; // a protobuf object
person.set_id(123);
person.set_name("Bob");
person.set_email("bob@example.com");
std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
sendSerializedPersonOverQTcpSocket(byteArray);
Run Code Online (Sandbox Code Playgroud)
从以下位置读回protobuf对象QByteArray
:
QByteArray byteArray = readSerializedPersonFromQTcpSocket();
Person person;
if (!person.ParseFromArray(byteArray, byteArray.size())) {
std::cerr << "Failed to parse person.pb." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
代替:
std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
Run Code Online (Sandbox Code Playgroud)
你也可以这样写:
QByteArray byteArray(person.SerializeAsString().c_str());
Run Code Online (Sandbox Code Playgroud)
编辑:上面两个给出相同的结果,但我不确定它是否正确.这个似乎更好:
QByteArray byteArray(QString::fromStdString(person.SerializeAsString()));
Run Code Online (Sandbox Code Playgroud)
编辑2:好的,现在我知道它是如何工作的:前两种方法是错误的,如果序列化中有\ 0个字符 - 它之后的一切都会丢失.要纠正它,可以写:
QByteArray byteArray(person.SerializeAsString().c_str(), person.ByteSize());
Run Code Online (Sandbox Code Playgroud)
小智 6
使用下面的代码真的很危险
std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
sendSerializedPersonOverQTcpSocket(byteArray);
Run Code Online (Sandbox Code Playgroud)
你可以在这里找到一个很好的解释在 protobuf-c 中,可选的 uint32 变量可以有值 0
从 protobuf 消息创建 QByteArray 的正确方法是
QByteArray byteArray;
byteArray.resize(message.ByteSize());
message.SerializeToArray(byteArray.data(), byteArray.size());
Run Code Online (Sandbox Code Playgroud)