3

我在序列化数据时遇到了很多麻烦。我究竟做错了什么?

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 中,然后是对象的 write 方法,它将自己写入内存缓冲区。然后,我将该缓冲区作为字符串返回。然后我会将序列化的字符串写到磁盘上。

我收到此错误:

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

以及此注释:

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 Thrift 1.0-dev、C++ 98。

4

2 回答 2

2

ThriftObject.write() 函数需要一个类型的参数

apache::thrift::protocol::TProtocol*

即 TProtocol 类型的“原始”指针。这里使用的protocolOut 对象是类型的共享指针。

shared_ptr<TBinaryProtocol> protocolOut

shared_ptr 的 'get()' 方法给出了由 shared_ptr 对象管理的原始指针。因此使用

obj.write(protocolOut.get());

应该解决问题

于 2015-01-30T06:39:35.927 回答
1

在 c++ 中,您可以使用 TFileTransport 和您选择的 Thrift 协议,即 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 :

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

ps.:它实际上在所有其他目标语言中都非常相似。

于 2014-07-26T14:02:51.567 回答