您好我是addressbook.proto
的一个简单示例,我使用SerailizeToString()
中的protobuf python
函数进行序列化。这是代码。
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教程中复制的。这给了我以下字符串。
b'\n\x08John Doe\x10\xd2\t\x1a\x10jdoe@example.com"\x0c\n\x08555-4321\x10\x01'
现在我想将此字符串导入c ++ protobuf。为此我写了下面的代码。
#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()
fucntion导入脚本,但这不起作用,我不确定它是如何工作的,因为我已经很久以来一直坚持这个。
我尝试更改二进制文件以适应c ++版本,但仍然不知道我是否在正确的道路上。
我怎样才能做到这一点?有人有线索吗?
答案 0 :(得分:1)
在Python中,您正在序列化Person
对象。在C ++中,您尝试解析AddressBook
对象。您需要在两端使用相同的类型。
(请注意,protobuf不保证它会检测到这些错误。有时当您将消息解析为错误类型时,解析似乎会成功,但内容将是垃圾。)
您的代码的另一个问题在这种特定情况下不会出现问题,但一般情况下不会起作用:
string data = "\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""";
如果字符串有任何NUL字节,即<&39; \ x00&#39;,则该行不起作用。如果是这样,该字节将被解释为字符串的结尾。要避免此问题,您需要指定数据的长度,例如:
string data("\n\x08""John Doe\x10""\xd2""\t\x1a""\x10""jdoe@example.com\"\x0c""\n\x08""555-4321\x10""\x01""", 45);