问题描述
我想序列化/反序列化以下类:
I'd like to serialize/unserialize following classes:
class Feature{
...
virtual string str()=0;
};
template<typename T>
class GenericFeature : public Feature{
T value;
...
virtual string str();
};
我阅读了 boost.serialize 文档,并说您必须注册类.我可以在构造函数中注册它们.但是加载会出现问题,因为注册是动态的,而不是静态的(据我了解,您必须在序列化/反序列化之前注册类).
I read boost.serialize docs and the sayed that you must register classes. I can register them in constructor. But there will be problems with loading, as registration will be dynamic, not static(As I understood, you must register classes prior to serialization/deserialization).
如何保存/加载这些类型的类?
How to save/load these type of classes?
推荐答案
首先告诉 boost Feature 是抽象的,并不总是需要:
First tell boost that Feature is abstract, is not always needed:
BOOST_SERIALIZATION_ASSUME_ABSTRACT(Feature);
序列化方法应该或多或少像这样:
The serialization method should look more or less like this:
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);
}
现在棘手的一点是在序列化/反序列化中注册类:
Now the tricky point is to register class in serialize/deserialize:
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;
如果您需要在某处隐藏显式注册并使其更加自动化,则可以制作特殊的函子模板来注册一个派生类,创建所有可用的并放入一个列表中,类 Feature 的一个静态方法将注册商场.但是问题是您需要注册所有版本的存档,现在我不知道多态存档是否可以完成这项工作.
If you need to hide explicit registering somewhere and make it more automatic, there is idea to make special functor template that register one derived class, create all avaible and put in a single list, that one static method of class Feature would register them all. However the problem will be that you need registration for all version of archive, right now i dont know if polymorphic archive will do the job or not.
这篇关于如何使用 Boost.serialize 序列化派生模板类?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!


大气响应式网络建站服务公司织梦模板
高端大气html5设计公司网站源码
织梦dede网页模板下载素材销售下载站平台(带会员中心带筛选)
财税代理公司注册代理记账网站织梦模板(带手机端)
成人高考自考在职研究生教育机构网站源码(带手机端)
高端HTML5响应式企业集团通用类网站织梦模板(自适应手机端)