儘管我遵循了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