【问题标题】:boost serialization base class without base_object提升没有 base_object 的序列化基类
【发布时间】:2012-11-09 23:31:32
【问题描述】:

我正在使用带有 boost 序列化的多重继承。而不是做

boost::serialization::base_object< Connection<T> >(*this)
boost::serialization::base_object< Collection<C> >(*this)

我在做

template<typename ArchiveT>
void save(ArchiveT& arc, const unsigned version) const{
  //both Connection<T> and Collection<C> are Base Classes
  Connection<T>::save(arc, version);
  Collection<C>::save(arc, version);
}

及其工作。那么他们两个是一样的吗?或者这样做有什么害处?我应该更改此代码吗?

{这个东西是很久以前编码的。所以我忘记了为什么我用这种方式编码。可能我当时不知道base_object}

我正在序列化大量数据(~1.6 GB)。当我序列化时,我看到序列化过程占用了大量内存并达到 3GB 的障碍。我试过评论序列化代码,它需要

【问题讨论】:

    标签: c++ memory serialization boost boost-serialization


    【解决方案1】:

    您应该更改代码并通过base_object&lt;&gt;() 序列化基类。

    来自documentation

    [...] 请注意,这与调用基类的序列化函数不同。这似乎可行,但会绕过用于跟踪对象的某些代码,以及注册基派生关系和序列化系统按设计运行所需的其他簿记。因此,所有的序列化成员函数都应该是私有的。

    额外的内存消耗可能是由object tracking引起的。 如果您要跟踪大量对象,则在序列化期间内存消耗会急剧增加。

    来自special considerations

    如果事先知道没有重复的指针值,则可以通过适当地设置对象跟踪类序列化特征来消除与对象跟踪相关的开销。

    如果您不需要对象跟踪,您可以通过以下方式禁用它:

    BOOST_CLASS_TRACKING(the_class, boost::serialization::track_never)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2021-05-25
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多