如何序列化派生模板类与Boost.serialize?(How to serialize deriv

2019-06-21 03:22发布

我想序列化/反序列化以下类:

class Feature{
...
virtual string str()=0;
};

template<typename T>
class GenericFeature : public Feature{
T value;
...
virtual string str();
};

我读boost.serialize文档和赛义德,你必须注册类。 我可以在构造函数中注册。 但会有问题加载,因为注册将是动态的,不是静态的(我的理解,你必须注册之前,序列化/反序列化类)。

如何保存/加载这些类型的课程?

Answer 1:

首先告诉提振该功能是抽象的,并不总是需要:

BOOST_SERIALIZATION_ASSUME_ABSTRACT(Feature);

序列化方法应该或多或少是这样的:

template<class Archive> 
void Feature::serialize(Archive & ar, const unsigned int version)
{
   ar & BOOST_SERIALIZATION_NVP(some_member);
}


template<typename T,class Archive> 
void GenericFeature<T>::serialize(Archive & ar, const unsigned int version)
{
   ar & boost::serialization::base_object<Feature>(*this);  //serialize base class
   ar & BOOST_SERIALIZATION_NVP(some_other_member);
}

现在棘手的问题是在序列化/反序列化注册类:

boost::archive::text_iarchive inputArchive(somesstream);

boost::archive::text_oarchive outputArchive(somesstream);

//something to serialize
Feature* one = new GenericFeature<SomeType1>();
Feature* two = new GenericFeature<SomeType2>();
Feature* three = new GenericFeature<SomeType3>();

//register our class, must be all of posible template specyfication    
outputArchive.template register_type< GenericFeature<SomeType1> >();
outputArchive.template register_type< GenericFeature<SomeType2> >();
outputArchive.template register_type< GenericFeature<SomeType3> >();

// now simply serialize ;-]
outputArchive << one << two << three;

// register class in deserialization
// must be the same template specification as in serialize
// and in the same correct order or i'm get it wrong ;-D   
inputArchive.template register_type< GenericFeature<SomeType1> >();
inputArchive.template register_type< GenericFeature<SomeType2> >();
inputArchive.template register_type< GenericFeature<SomeType3> >();

Feature* another_one;
Feature* another_two;
Feature* another_three;

// and deserialize ;-]
inputArchive >> another_one >> another_two >> another_three;

如果你需要在某个地方隐藏明确的登记,并使其更加自动的,有想法,使该注册一个派生类特殊的仿函数模板,创建所有avaible,放在一个单独的列表,该类特征的一个静态方法将它们注册所有。 然而这个问题将是您需要注册的所有版本档案的,现在我不知道,如果多态存档将做的工作或没有。



文章来源: How to serialize derived template classes with Boost.serialize?