【问题标题】:Tokyo Cabinet and variable size C++ objectsTokyo Cabinet 和可变大小的 C++ 对象
【发布时间】:2009-08-19 21:06:23
【问题描述】:

我正在用 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 中存储可变长度对象的最佳方式是什么。

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

谢谢

【问题讨论】:

    标签: c++ serialization sizeof tokyo-cabinet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      简而言之。 这行不通。

      【讨论】:

      • 我也很害怕。我想我需要一个序列化库。
      【解决方案3】:

      虽然我使用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 ]
      

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          我使用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 相当快。

          【讨论】:

            猜你喜欢
            • 2011-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-21
            • 2010-12-05
            • 1970-01-01
            相关资源
            最近更新 更多