2

我正在用 C++ 构建一个使用 Tokyo Cabinet(C 中的原始 API)的系统。问题是我想存储一个类,例如:

    class Entity {
      public:
        string entityName;
        short type;
        vector<another_struct> x;
        vector<another_struct> y
        vector<string> z;
    };

问题是向量和字符串的长度是可变的。当我将 void* (我的对象)传递给东京内阁以便它可以存储它时,我还必须以字节为单位传递对象的大小。但这不能轻而易举地做到。

确定对象字节数的最佳方法是什么?或者在 Tokyo Cabinet 中存储可变长度对象的最佳方法是什么。

我已经在考虑寻找序列化库。

谢谢

4

5 回答 5

9

您不能将非 POD C++ 结构/类可移植地视为原始字节序列 - 这与使用指针或std::stringand无关std::vector,尽管后者实际上保证它会在实践中中断。您需要先将对象序列化为一系列字符 - 我建议使用 Boost.Serialization以获得良好、灵活的跨平台序列化框架。

于 2009-08-19T21:24:14.983 回答
4

我认为情况比这更糟。向量的实际存储与对象的其余部分不连续。您会看到std::vector<>s 将他们的数据保存在堆上的单独分配中(因此他们可以在需要时扩展它们)。您需要一个能够理解 c++ 和 STL 的 API。

简而言之。这是行不通的。

于 2009-08-19T21:14:10.340 回答
0

尽管我使用HDF5 ,但我遇到了类似的问题。就我而言,还有一个额外的要求是我可以读取对象的子部分,因此序列化并不是一个真正的选择。

HDF 非常像一个大型数组,其中使用索引来访问数据。another_struct我使用的解决方案是在存储类型的表中添加“上一个索引” 。

以您的示例为例,如果“x”和“y”各有 3 个和 2 个元素,则数据将按如下方式存储:

[ index ] [ another_struct data here ] [ previous_index ]
[   0   ] [       x data 0           ] [ -1 ]
[   1   ] [       x data 1           ] [  0 ]
[   2   ] [       x data 2           ] [  1 ]
[   3   ] [       y data 0           ] [ -1 ]
[   4   ] [       y data 1           ] [  3 ]

然后,在主 Entity 表中,存储了最后添加的索引:

[ index ] [ Entity data here ] [ x ] [  y ]
[   0   ] [        ...       ] [ 2 ] [  4 ]

我不太熟悉东京内阁的工作方式,所以虽然这种方法应该有效,但它可能不是该数据格式的最佳选择。理想情况下,如果您可以拥有指向真正的东京内阁对象的指针,那么您可以存储这些指针,而不是像我上面那样使用索引。

于 2009-08-20T09:39:17.457 回答
0

是的,你最好使用 boost 序列化或 protobuf 对对象进行消毒并放入 Cabinet 中

于 2009-12-18T18:54:54.213 回答
0

我使用Protocol Buffers将我的 C++ 对象存储为 Tokyo Cabinet 数据值。

在 Protocol Buffers 中,您可以指定结构,然后为 C++、Python 和 Java 生成编组/解组代码。在您的情况下, .proto 文件如下所示:

message Entity {
    optional string entityName = 1;
    optional int32 type = 2; //protobuf has no short
    short type = 3;
    repeated AnotherStruct x = 4;
    repeated AnotherStruct y = 5;
    repeated string z = 6;
};

特别是如果数据库存在很长时间,一个可以更新的系统,例如覆盖新的领域是非常有价值的。与 XML 等相比,protobuf 相当快。

于 2009-12-31T09:29:51.413 回答