C++ Qt+;原型,类型?

C++ Qt+;原型,类型?,c++,qt,types,protocol-buffers,C++,Qt,Types,Protocol Buffers,我想在Qt开发中深入研究一下谷歌的协议缓冲区,但我很难找出如何最好地结合它们 最后,我希望使用协议缓冲区使用qudsocket和qtcsocket发送 在协议缓冲区消息到通过套接字(QByteArray)发送数据,然后再从另一端返回的最佳方法是什么?从protobuf对象创建QByteArray: Person person; // a protobuf object person.set_id(123); person.set_name("Bob"); person.set_email("bo

我想在Qt开发中深入研究一下谷歌的协议缓冲区,但我很难找出如何最好地结合它们

最后,我希望使用协议缓冲区使用
qudsocket
qtcsocket
发送


在协议缓冲区
消息
到通过套接字(
QByteArray
)发送数据,然后再从另一端返回的最佳方法是什么?

从protobuf对象创建
QByteArray

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);
QByteArray
读取protobuf对象:

QByteArray byteArray = readSerializedPersonFromQTcpSocket();
Person person;
if (!person.ParseFromArray(byteArray, byteArray.size())) {
  std::cerr << "Failed to parse person.pb." << std::endl;
}
QByteArray-byteArray=readSerializedPersonFromqtcSocket();
个人;
if(!person.ParseFromArray(byteArray,byteArray.size())){

std::cerr@James:您可以使用
ParseFromArray()
,例如:(请注意,
ParseFromArray()
仅在libs的proto-buf-lite版本上可用)

而不是:

std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
你也可以写:

QByteArray byteArray(person.SerializeAsString().c_str());
编辑:上面两个给出了相同的结果,但我不确定它是否正确。这一个似乎效果更好:

QByteArray byteArray(QString::fromStdString(person.SerializeAsString()));
EDIT2:好的,现在我知道它是如何工作的了:如果序列化中有\0个字符,那么前两种方法都是错误的-之后的所有内容都会丢失。要更正它,可以编写:

QByteArray byteArray(person.SerializeAsString().c_str(), person.ByteSize());

使用下面的代码是非常危险的

std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
sendSerializedPersonOverQTcpSocket(byteArray);
你可以在这里找到一个很好的解释

从protobuf消息创建QByteArray的正确方法是

QByteArray byteArray;
byteArray.resize(message.ByteSize());
message.SerializeToArray(byteArray.data(), byteArray.size());

本身没有错,但您需要某种方法来识别另一端的消息。此外,您还需要识别数据的长度。Protobuf在内部不做这两件事。此外,流输出版本是格式化程序中速度最慢的,向量/数组输出速度更快。我一直在尝试使用
SerializeToArray
方法,但不知道如何转换到
QByteArray
。您能举个例子吗?请参阅下面的格式化代码-我不知道如何在注释中格式化代码。对此表示抱歉。\n\n void convertqbytearray用户(QByteArray&abyteraray){com::your::name\u space::User;if(!User.ParseFromArray)(aByteArray.data(),aByteArray.size()){//无法分析}其他{//yayyyy if(user.has_userid()){//…}不要忘记使用
std::ostringstream
时要包含
。不过,我建议使用@matemaciek@VijayMathew我在哪里可以找到函数SendSerializedPersonOverqtcSocket?由于错误的语句,Downvote:仅在libs的proto-buf lite版本上可用。我花了两个小时o了解它在完整版本中也可用!查看:
此接口由所有协议消息对象实现。非lite消息另外实现消息接口,它是MessageLite的子类
QByteArray byteArray;
byteArray.resize(message.ByteSize());
message.SerializeToArray(byteArray.data(), byteArray.size());