2013-10-30 24 views
3

我在序列化數據時遇到了很多麻煩。我究竟做錯了什麼?C++中的Apache Thrift序列化

std::string serialize(ContactsList& obj, std::string filename) { 
    shared_ptr<TMemoryBuffer> transportOut(new TMemoryBuffer()); 
    shared_ptr<TBinaryProtocol> protocolOut(new TBinaryProtocol(transportOut)); 
    obj.write(protocolOut); 
    std::string serialized_string = transportOut->getBufferAsString(); 
    return serialized_string; 
} 

這是我從另一種方法調用的方法。我希望找回一個序列化的二進制字符串,我可以寫出到磁盤。在這個序列化方法中,我創建了一個TMemory緩衝區,然後將其包裝在TBinaryProtocol中,然後將其寫入內存緩衝區中的寫入方法。然後,我將該緩衝區作爲一個字符串返回。然後,我會將序列化的字符串寫入磁盤。

note: no known conversion for argument 1 from ‘boost::shared_ptr<apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport> >’ to ‘apache::thrift::protocol::TProtocol* 

我使用Apache節儉1.0-dev的,C++ 98如果這些東西有所作爲:

我得到這個錯誤:

error: no matching function for call to ‘addressbook::ContactsList::write(boost::shared_ptr<apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport> >&) 

除了此說明。

回答

1

在C++中,你可以使用TFileTransport和您所選擇的儲蓄協議,即TBinaryProtocol:

shared_ptr<TFileTransport> transport(new TFileTransport(filename)); 
shared_ptr<TBinaryProtocol> protocol(new TBinaryProtocol(transport)); 
yourObj.write(protocol.get()); // to write 

yourObj.read(protocol.get()); // to read 

,以確保該文件存在,你可以使用前一個開放:

open(filename.c_str(), O_CREAT|O_TRUNC|O_WRONLY, 0666); // create file 

ps .:它在所有其他目標語言中實際上非常相似。

2

的ThriftObject.write()函數期望類型

apache::thrift::protocol::TProtocol* 

即類型TProtocol的 '原始' 指針的參數。這裏使用的protocolOut對象是類型的共享指針。

shared_ptr<TBinaryProtocol> protocolOut 

shared_ptr的'get()'方法給出由shared_ptr對象管理的原始指針。 因此,使用

obj.write(protocolOut.get()); 

應該解決這個問題

+0

與信息更新答案 –