尽管我遵循了C++和Python的优秀协议缓冲区文档和教程,但我无法达到我的目标: - 从C++进程序列化数据。 - 将其从同一进程插入到LevelDB中。 - 从一个Python过程 提取串行化DATAS - 从该相同的Python进程 Deseralize它 - 使用那些deseralized DATAS在Python通过LevelDB将协议缓冲区序列化数据从C++传递到Python
余可使用协议缓存在C++串行化我的DATAS(使用的std :: string容器) 。我可以将它插入到LevelDB中。但是,当我levelDB->获取我的序列化数据,虽然Python似乎认识到它是一个字符串,并显示我的原始内容,只要我反序列化为一个Python字符串,它是空的!
这是我如何序列化和插入我的DATAS在C++:
int main(int arg, char** argv)
{
GOOGLE_PROTOBUF_VERIFY_VERSION;
leveldb::DB* db;
leveldb::Options options;
leveldb::Status status;
tutorial::AddressBook address_book;
tutorial::Person* person1;
tutorial::Person* person2;
options.create_if_missing = true;
status = leveldb::DB::Open(options, "test_db", &db);
assert(status.ok());
person1 = address_book.add_person();
person1->set_id(1);
person1->set_name("ME");
person1->set_email("[email protected]");
person2 = address_book.add_person();
person2->set_id(2);
person2->set_name("SHE");
person2->set_email("[email protected]");
std::string test;
if (!address_book.SerializeToString(&test))
{
std::cerr << "Failed to write address book" << std::endl;
return -1;
}
if (status.ok()) status = db->Put(leveldb::WriteOptions(), "Test", test);
这里是我尝试反序列化在Python:
address_book = addressbook_pb2.AddressBook()
db = leveldb.LevelDB('test_db')
ab = address_book.ParseFromString(db.Get("Test"))
广告变种类型是NoneType
编辑: 之前的db.Get(),ab.ByteSize()返回0,76后的ParseFromString(),我认为这是一个类型问题,然后... + ab.ListFields()返回一个包含字段的unexploitable
列表:成功地检测两个人的实例,但无法让我访问它。
任何线索,我不明白的任何想法,我在这里做错了什么?
非常感谢!
您可以尝试反序列化C++中的对象,以确保序列化工作正确。 – 2012-01-28 13:42:51
是的,我试图用C++反序列化它,并且它工作正常:-) – Oleiade 2012-01-28 13:44:34