【问题标题】:Is boost::serialization::base_object required every time I do inheritance?每次我进行继承时都需要 boost::serialization::base_object 吗?
【发布时间】:2020-10-21 01:34:31
【问题描述】:

我有:

  • 非多态(无虚方法)类层次结构;

  • 基类已经包含serialize;

  • 子类直接序列化;

      class A
      {
      private:
          int x;
          int y;
    
          template<typename Archive>
          void serialize(Archive& ar, const unsigned int)
          {
              ar & x & y;
          }
      };
    
      class B : public A { /* no data members*/ };
    
      class C : public A { /* no data members*/ };
    
  1. 在B 和C 类中是否需要serialize 函数? B 和 C 中的 serialize 函数正是这样的:

     template<typename Archive>
     void serialize(Archive& ar, const unsigned int version)
     {
         ar & boost::serialization::base_object<A>(*this);
     }
    
  2. 我应该在文档中对此进行一些注释吗?

【问题讨论】:

标签: c++ boost boost-serialization


【解决方案1】:

没有。如果您不想从基础序列化数据,则可能不需要它。

但是,在多态层次结构中,您确实需要它来告诉存档有关已注册类型的信息。

见https://www.boost.org/doc/libs/1_73_0/libs/serialization/doc/serialization.html

这里有很多例子:https://stackoverflow.com/a/35756430/85371

【讨论】:

  • 感谢您的回答和链接,看起来它比我想象的要复杂。请让我澄清我的问题,然后确认我正确理解了示例。
  • 我查看了您提供的样品,但它们似乎并没有真正触及我的情况。因此问题已更新。你能再看看吗?
  • 所以,不,不需要基类序列化。 (这说明为什么总是需要一个明确的代码答案。在我的回答中,我假设你有一个基类/没有/有趣的成员,而派生类拥有一切,但是是的,反过来也一样)。
  • 这是一种品味。我希望像“你不需要这个”这样的声明会导致更多的问题。此外,该库并没有真正说明您需要它:它只是告诉您如何进行序列化(确保它具有 serialize 成员或可通过 ADL 访问和可见的同上免费函数)
  • 对,我正在考虑这个问题。例如,如果我有免费的 serialize 接受基类引用,它应该可以正常工作,就像在任何其他情况下一样,例如覆盖operator&lt;&lt;(ostream&amp;。谢谢!
猜你喜欢
  • 2021-02-24
  • 2020-06-10
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
  • 2011-06-17
相关资源
最近更新 更多