2012-01-28 90 views
0

尽管我遵循了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列表:成功地检测两个人的实例,但无法让我访问它。

任何线索,我不明白的任何想法,我在这里做错了什么?

非常感谢!

+0

您可以尝试反序列化C++中的对象,以确保序列化工作正确。 – 2012-01-28 13:42:51

+0

是的,我试图用C++反序列化它,并且它工作正常:-) – Oleiade 2012-01-28 13:44:34

回答

1

好了,这是我不好。

我回到了Protocol Buffers Python文档,事实是,即使我检索的AdressBook对象没有显示任何描述,它仍然可以迭代,甚至有一个。 str()方法。

因此,如果有人再次遇到这个问题,试着像使用iPython一样探索ProtocolBuffers对象,并且您会发现每个proto元素都是对象的字段。 使用我的示例:

ab = adress_book.ParseFromString(db.Get('Test')) 
ab.__str__() # Shows a readable version of my object 
for person in adress_book.person: # I'm even able to iterate over any of my ab fields values 
    print person.id 
    print person.name 
0

尝试使用'代替"

ab = address_book.ParseFromString(db->Get('Test')) 
+0

尽管python中的简单引号和doulbe引号是等价的,但我试过了,但它没有奏效:-)仍然是NoneType结果。 – Oleiade 2012-01-28 13:51:27

+0

好的,这是一个尝试... – 2012-01-28 13:54:08

+0

并感谢尝试,真的! :-) – Oleiade 2012-01-28 13:57:29