【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 ...
随机推荐
- C# DateTime和String(转)
http://www.cnblogs.com/Pickuper/articles/2058880.html C#语言之“string格式的日期时间字符串转为DateTime类型”的方法 方法一:Con ...
- Java 调用OPENOFFIC 转换文档类型
public static void office2PDF(String sourceFile, String destFile) { try { File inputFile = new File( ...
- JS 的引用赋值与传值赋值
这个问题说大不大说小不小,如果你有幸踩了这个坑,一定会找这篇文章,哈哈~ 现说一下JS数字的类型:基本类型和引用类型 先看下下面两个栗子: var a = 30; var b = a; a = 20; ...
- JavaScript -- 没事看看
@.delete 原文:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/delete
- javascript的defer和async(转载)
http://ued.ctrip.com/blog/?p=3121 我们常用的javascript标签,有两个和性能.js文件下载执行相关的属性:defer和async defer的含义[摘自http ...
- iOS - 集成SDK问题
1.大部分社交平台接口不支持https协议. 问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据.对ShareSDK来说,具体表现可能是,无法授权.分享 ...
- 利用.dSYM跟.app文件准确定位Crash位置
本文转载至 http://blog.csdn.net/lvxiangan/article/details/28102629 利用.dSYM和.app文件准确定位Crash位置首先,确保 ...
- C# WinForm退出方法
1.this.Close(); 只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出: 2.Application.Exit(); 强制所有消息中 ...
- 【WinForm】创建自定义控件(转)
转自:http://www.cnblogs.com/bomo/archive/2012/12/09/2810559.html 虽然VS为我们提供了很多控件可以使用,但有时候这些控件仍然不能满足我们的要 ...
- Future 异步回调 大起底之 Java Future 与 Guava Future
目录 写在前面 1. Future模式异步回调大起底 1.1. 从泡茶的案例说起 1.2. 何为异步回调 1.2.1. 同步.异步.阻塞.非阻塞 1.2.2. 阻塞模式的泡茶案例图解 1.2.3. 回 ...