当前位置:  开发笔记 > 编程语言 > 正文

Qt + protobuf,类型?

如何解决《Qt+protobuf,类型?》经验,为你挑选了2个好方法。

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

最终,我想发送QUdpSocketQTcpSocket使用协议缓冲区.

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



1> Vijay Mathew..:

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);

从以下位置读回protobuf对象QByteArray:

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


本身并没有错,但你需要在某一方面识别另一方的消息.另外,您需要确定数据的长度.Protobuf内部没有做这两件事.此外,流输出版本是格式化程序中最慢的 - 矢量/数组输出更快.

2> matemaciek..:

代替:

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());

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有