【boost】使用serialization库序列化子类
boost.serialization库是一个非常强大又易用的序列化库,用于对象的保存与持久化等。
使用base_object可以在序列化子类的同时也序列化父类,以此获得足够的信息来从文件或网络数据中反序列化出子类。
最近在工作中却遇到这样一个问题,代码示例如下
struct Field
{
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::make_nvp("FieldImpl", serializeString);
} string serializeString;
}; template<typename ValueType>
struct SubField : Field
{
typedef ValueType type; friend class boost::serialization::access;
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & boost::serialization::make_nvp("CommonField", boost::serialization::base_object<Field>(*this));
ar & boost::serialization::make_nvp("data", data);
} type data;
};
有超类Field与模板子类SubField(可能还会有其他子类),现在需要通过超类指针多态序列化子类
首先想到的办法是将超类serialize方法签名为virtual,通过多态调用子类serialize方法。但是这却是不可能的,因为serialize方法是一个模板函数,不能为vitual方法,所以这条路不通。
无奈之下只好直接尝试一下:
shared_ptr<SubField<int> > spSub(new SubField<int>());
spSub->data = ;
spSub->serializeString = "sub";
shared_ptr<Field> spField(new Field());
spField = boost::static_pointer_cast<Field>(spSub); std::stringstream ss;
boost::archive::xml_oarchive ar(ss, boost::archive::archive_flags::no_header); ar << boost::serialization::make_nvp("Field", spField);
std::cout << ss.str();
不出所料,运行时抛出了异常。
重新阅读手册及serialization文档,意外发现几个关键词,BOOST_SERIALIZATION_ASSUME_ABSTRACT和BOOST_CLASS_EXPORT,继续求助sof后,终于找到了问题得解决办法,原文链接如下:
http://stackoverflow.com/questions/8370727/error-serializing-an-abstract-class-with-boost
第一种是使用BOOST_SERIALIZATION_ASSUME_ABSTRACT配合archive的template register_type方法
第二种是直接使用BOOST_CLASS_EXPORT,导出所有继承链中的class
对于第二种方法直接使用
BOOST_CLASS_EXPORT(Field)
BOOST_CLASS_EXPORT(SubField<int>)
问题解决,输出为:
【boost】使用serialization库序列化子类的更多相关文章
- 如何用boost::serialization去序列化派生模板类(续)
在 如何用boost::serialization去序列化派生模板类这篇文章中,介绍了序列化派生类模板类, 在写測试用例时一直出现编译错误,调了非常久也没跳出来,今天偶然试了一下...竟然调了出来. ...
- 使用C++的开源序列化(Serialization)库cereal
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:使用C++的开源序列化(Serialization)库cereal.
- 如何在C++中使用boost库序列化自定义class ?| serialize and deserialize a class in cpp with boost
本文首发于个人博客https://kezunlin.me/post/6887a6ee/,欢迎阅读! serialize and deserialize a class in cpp Guide how ...
- Boost的Serialization和SmartPoint搭配使用
准确来说,这篇博文并不是译文,而是一篇某个网页中代码改写而来.原文章中的代码存在几处严重错误,网页又不提供留言功能(不是没有而是一个没有留言功能的留言板).4年过去了,作者对这些错误不更正让人无法接受 ...
- Boost的某些库还是需要生成二进制的库的,必须安装才行,以及使用库的方法
头文件就是库使用者最常问的问题就是“我该怎么安装Boost”,这个也是我一开始最关心的问题,Boost这点做的很好,将大部分实现都封装在头文件里,所以对于一些基本的Boost库,其实是不需要安装的,只 ...
- boost之date_time库
最近开了boost库的学习,就先从日期时间库开始吧,boost的date_time库是一个很强大的时间库,用起来还是挺方便的.以下算是我学习的笔记,我把它记录下来,以后便于我复习和查阅. #inclu ...
- 在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据
在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持 Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Jso ...
- 初探boost之timer库学习笔记
timer 使用方法 #include <boost/timer.hpp> #include <iostream> using namespace std; usi ...
- Boost 常用的库
boost是一系列C++模板库组成的免费,可移植,开源的程序库.网络上关于boost的文章已经很多. 这里摘记一些库的信息,供自己日后参考. 0.foreach - BOOST_FOREACH ...
随机推荐
- HTML5 Support In Visual Studio 2010
最近HTML5浪潮已经开始了,VS2010已经有一个扩展支持在HTML5智能提示.你可以从这里下载这个扩展: http://visualstudiogallery.msdn.microsoft.com ...
- npm安装package.json
npm安装package.json时,直接转到当前项目目录下,用命令npm install 或npm install --save-dev安装即可,自动将package.json中的模块安装到node ...
- SAS学习经验总结分享:篇三—SAS函数
SAS函数学习 文章为原创,禁止复制或转载,转载请标明出处, http://www.cnblogs.com/smallcrystal/p/4842346.html 1.函数输写格式: 1)一般书写格式 ...
- 电容有什么作用?为什么cpu电源引脚都并联一个电容?
管理 随笔- 17 文章- 1 评论- 1 电容有什么作用?为什么cpu电源引脚都并联一个电容? 正文: 参考资料:http://blog.sina.com.cn/s/blog_7880d3 ...
- 转:RC复位电路的原理及其复位时间的计算
RC复位电路的原理及其复位时间的计算 低电平有效复位电路如下 此复位电路是针对低电平有效复位而言的,其中二极管是起着在断电的情况下能够很快的将电容两端的电压释放掉,为下次上电复位准备. 假设电容两 ...
- Spring学习十一----------Bean的配置之基于Java的容器注解@Bean
© 版权声明:本文为博主原创文章,转载请注明出处 @Bean -@Bean标识一个用于配置和初始化一个由SpringIOC容器管理的新对象的方法,类似于XML配置文件的<bean/> -可 ...
- Android有关surfaceView又一次创建的问题。
近期在做一个Android视频播放器的项目.遇到一个问题,就是锁屏之后.surfaceview就会被销毁掉,然后就会出现各种错误.到csdn论坛去发帖提问,各种所谓的大神都说,解锁屏在又一次创建一个, ...
- 使用HTML5制作简单的RPG游戏
很久以前就想着做一个游戏,但什么都不会又不知道从哪里开始,胡乱找来一些书籍和资料结果太深奥看不懂,无奈只能放弃.这一弃就是十多年,倥偬半生,眼看垂垂老矣,还是没能有什么成果. 近年来游戏引擎越来越多, ...
- 资源重复 uac.res resource kept(转)
一般按照网上流传的方法制作UAC.RES放到DELPHI程序里面来就可以出现盾牌.但是某些DELPHI的项目在添加了UAC.RES后编译会报错,例如: [DCC Error] E2161 Warnin ...
- pooler 连接池中报错" error_no_members"
连接池驱动,pooler 在使用中会报错" error_no_members" 分析:可能有以下3个地方对其有影响: 1)member 可能没回收: 2)wait_for_p ...