我写了一个 thrift-definition,并使用这个定义在一个文件中序列化多个记录(我在每个记录的开头添加了整个记录的大小)。简而言之,这就是我所做的。
boost::shared_ptr<apache::thrift::transport::TMemoryBuffer> transport(new apache::thrift::transport::TMemoryBuffer);
boost::shared_ptr<apache::thrift::protocol::TBinaryProtocol> protocol(new apache::thrift::protocol::TBinaryProtocol(transport));
myClass->write(protocol.get());
const std::string & data(transport->getBufferAsString());
之后我只是以二进制模式打印字符串数据。现在我想再次反序列化这个文件。如果文件中只有记录,我不会有任何问题,不幸的是我必须打印多个文件,所以我想我必须根据我保存在文件中的大小以及记录本身来使用偏移量。但是,我似乎找不到任何可以用来实现我的目标的例子,而且官方文档也很缺乏。有没有人给我小费。如果我遗漏了一些信息,请直接询问。
更多信息:
我当然想用use thrift反序列化。但是,一个文件可以包含多个记录。例如:假设我在包含汽车信息的 Thrift 定义文件中定义了一个结构。现在我在一个输出文件中序列化多个汽车结构。序列化没有问题,因为我只是附加数据。但是,如果我想反序列化,我必须知道一个记录从哪里开始,下一个记录从哪里开始。那是我的问题。我不知道如何告诉 thrift 一张唱片的起点和终点。我在网上搜索过,但似乎找不到 C++ 的示例(到目前为止我有一个 Python 的示例,但无法将其翻译成 C++)。一个文件的结构可以描述如下:[lenghtofrecord1][record1][lengthofrecord2][record2][...]
提前致谢
迈克尔
最佳答案
有一个list<records>
怎么样?你作为一个整体去/序列化?或者独立随机阅读它们是绝对必要的吗?如果是,我看到 1,5(一个半)可能的解决方案:
有第二个文件作为索引。这拥有一个
map< recordNumber, offset>
,或者只是一个排序的整数对列表,用于快速定位记录。由于这些数据比记录少得多,您可能可以一直将其缓存在内存中。一半的解决方案:如果记录大小是固定的,则可以通过乘以
recordSize * (recordNr-1)
轻松计算出任何记录位置。 .这样你甚至不需要尺寸前缀。如果记录或其他可变大小的实体中有字符串,这将不起作用,除非您通过为每个具有预定义(最大)大小的记录保留缓冲区来强制固定记录大小。它有点难看,因此是“半”解决方案,但您不需要索引文件。
关于c++ - 如何反序列化包含多条记录的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19836828/