繁体   English   中英

Qt + protobuf,类型?

[英]Qt + protobuf, types?

我想在Qt开发中深入研究Google的协议缓冲区,但我无法弄清楚如何最好地合并它们。

最后,我想使用协议缓冲区使用QUdpSocketQTcpSocket发送。

在协议缓冲区message之间进行通过套接字( 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;
}

代替:

std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());

你也可以这样写:

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

编辑:上面两个给出相同的结果,但我不确定它是否正确。 这个似乎更好:

QByteArray byteArray(QString::fromStdString(person.SerializeAsString()));

编辑2:好的,现在我知道它是如何工作的:前两种方法是错误的,如果序列化中有\\ 0字符 - 它之后的一切都会丢失。 要纠正它,可以写:

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

使用下面的代码非常危险

std::ostringstream out;
person.SerializeToOstream(&out);
QByteArray byteArray(out.str().c_str());
sendSerializedPersonOverQTcpSocket(byteArray);

你可以在这里找到一个很好的解释在protobuf-c中,可选的uint32变量的值为0

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

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

@James:您可以使用ParseFromArray() ,例如,如下所示:(请注意, ParseFromArray()仅适用于lib的proto-buf-lite版本)。

void convertQByteArrayToUser(QByteArray& aByteArray)
{
    com::your::name_space::User user;
    if(!user.ParseFromArray(aByteArray.data(), aByteArray.size())) 
    {
        //could not parse
    }
    else { //yayyyyy            
        if(user.has_userid())
        {
            //...
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM