首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ProtoBuf ()和ParseFromString()函数将Python ProtoBuf转换为SerializeToString ProtoBuf

使用ProtoBuf ()和ParseFromString()函数将Python ProtoBuf转换为SerializeToString ProtoBuf
EN

Stack Overflow用户
提问于 2017-07-30 19:29:56
回答 1查看 2.6K关注 0票数 0

嗨,我有一个简单的addressbook.proto示例,我正在使用python中的protobuf SerailizeToString()函数进行序列化。这是密码。

代码语言:javascript
复制
import address_pb2

person = address_pb2.Person()
person.id = 1234
person.name = "John Doe"
person.email = "jdoe@example.com"
phone = person.phones.add()
phone.number = "555-4321"
phone.type = address_pb2.Person.HOME

print(person.SerializeToString())

其中address_pb2是我从protobuf编译器生成的文件。请注意,该示例是从protoBuf教程中复制的。这给了我下面的字符串。

代码语言:javascript
复制
b'\n\x08John Doe\x10\xd2\t\x1a\x10jdoe@example.com"\x0c\n\x08555-4321\x10\x01'

现在,我想将这个字符串导入到c++原型中。为此,我编写了以下代码。

代码语言:javascript
复制
#include <iostream>
#include <fstream>
#include <string>
#include "address.pb.h"
using namespace std;

int main(int argc, char* argv[]) {
  GOOGLE_PROTOBUF_VERIFY_VERSION;


  tutorial::AddressBook address_book;
  string data = "\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""";
  if(address_book.ParseFromString(data)){
    cout<<"working"<< endl;
  }
  else{
    cout<<"not working" << endl;
  }


  // Optional:  Delete all global objects allocated by libprotobuf.
  google::protobuf::ShutdownProtobufLibrary();

  return 0;
}

在这里,我只是尝试使用ParseFromString()函数导入脚本,但这不起作用,而且我不确定它将如何工作,因为我已经坚持了很长时间了。

我试着修改二进制文件,以适应c++版本,但仍然不知道我是否在正确的路径上。

我怎样才能做到这一点?有人有线索吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 22:36:58

在Python中,您正在序列化一个Person对象。在C++中,您正在尝试解析一个AddressBook对象。你需要在两端使用相同的类型。

(请注意,protobuf并不保证它会检测到这些错误。有时,当您将消息解析为错误的类型时,解析看起来会成功,但内容将是垃圾。)

在这个特定的情况下,您的代码还有另一个问题,但在一般情况下不起作用:

代码语言:javascript
复制
string data = "\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""";

如果字符串有任何NUL字节,即'\x00‘,这一行就不能工作。如果是这样,该字节将被解释为字符串的结尾。为了避免这个问题,您需要指定数据的长度,如下所示:

代码语言:javascript
复制
string data("\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""", 45);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45403854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档