【问题标题】:static members and boost serialization静态成员和提升序列化
【发布时间】:2010-10-14 13:14:13
【问题描述】:

我正在使用Boost.Serialization 来归档课程的内容。成员变量之一是静态 std::vector。

存档和恢复都很好,但我有点希望库只保存一次静态成员,从文件大小来看,静态成员似乎已为每个存档实例完全保存。

这很容易通过对静态向量使用 set/getter 并在类外序列化静态向量一次来规避。

但我宁愿有一个自包含的课程。是否有一种简洁且简单的方法来实现仅将类的静态内容归档一次?

【问题讨论】:

    标签: c++ serialization boost static


    【解决方案1】:

    在序列化所有类的实例之前序列化静态向量。

    如果你像这样序列化向量:

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version)
    {
        ar & this->someVar;
        ar & this->AnotherVar;
        ar & staticVector;  
    }
    

    那么,可以肯定的是,静态向量确实会随每个实例进行序列化。

    如果您需要进一步说明,请发布您的 serialize 函数和调用它的函数。

    【讨论】:

    • 老实说,我认为这不是那么“肯定”。由于静态实例驻留在每个类实例的相同内存地址,我希望库能以某种方式获取它并且足够聪明,不会每次都将向量写入文件。
    • 首先序列化向量,然后是所有实例,这是我所说的“容易绕过”,正如我所说,我宁愿为我的班级提供一个自包含的 serialize() ......但是,如果这不能完成,首先序列化向量是我当然也会坚持的(这就是它现在的工作方式......)
    • 可以肯定的是,Boost 会序列化你告诉它序列化的内容,无论它的内存位置如何,它都无法猜测。如果以某种方式神奇地起作用,静态部分将存储在哪里?开头,结尾,中间?一种方法是使用“序列化”之类的标志。
    • ... 在“序列化”函数中表示静态数据是否已被反序列化。
    【解决方案2】:

    我在 Boost.Serialization 方面的经验非常有限,因此请考虑以下内容:

    IIRC,您希望对静态成员的处理是使用指针完成的。所以也许序列化指向静态成员的指针会起作用。

    自我批评:不过,我不确定在反序列化时如何应用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      相关资源
      最近更新 更多