2012-01-28 73 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