【原创】 Boost序列化了解设计思想

 

在计算机科学的数据存储中,序列化是将数据结构或对象状态转换为,可以被存储(例如,在文件或者内存中)或者被传递(例如,网络通讯)的格式,并且后续能被重新转换构建(可能在不同的计算器环境)。——摘自(翻译)维基百科

 

文章概要

 

    本文参考Boost序列化官方文档,主要内容包括Boost序列化的背景、目标、设计思想和疑难问题,了解Boost序列化的设计思想。

Boost序列化的背景

 

    Boost序列化的官方文档,最近的更新时间大概在2009年,主要的写作时间是2002年至2004年。官方文档主要包括使用教程、实现参考手册和案例分析等,内容比较宽泛,讲述了Boost序列化从无到有的过程以及碰到的一些疑难问题。

图1-1 官网首页图片

Boost序列化的目标

 

    Boost序列化是为了解决C++语言的序列化问题。具体来说,就是支持C++所有数据结构的序列化,例如基础数据类型,指针(包括共享指针)、STL容器、数组、继承(包括虚继承和菱形继承)等。目前支持的序列化协议有,二进制、文本和XML格式。

Boost序列化的设计思想

 

Boost序列化中的两个重要概念,serialization,表示一组任意的C++数据结构可以和一串字节序相互解构(deconstruction);archive,指代字节流一种特定呈现。serialization完成特定数据结构序列化和反序列化的通用算法工作;archive完成特定协议的相互转换工作。这为Boost序列化支持更多的序列化协议提供了可扩展性。

    考虑到现有软件项目如何使用Boost序列化,采用了入侵性和非入侵性的两种接入方式。入侵性的方式,使用方需要将CAccess类作为待序列化类的友元类;非入侵性的方式,使用方将待序列化类的成员变量设为公有。

    Boost序列化属于面向I/0流的设计方式,"<<"作为序列化的运算符,">>"作为反序列化的运算符;能够很方便地支持文件的序列化和反序列化(存档和读档),源码实现中继承了C++标准库中的std::istream和std::ostream类。

    Boost序列化的可扩展性,可以从boost\archive\text_oarchive.hpp文件中boost::archive::text_oarchive类(文本协议序列化类)的继承关系来分析(图1-2)。在图1-2中detail::common_oarchive<Archive>以上的类做为整个序列化的抽象模型,以下的类做为特定协议的序列化实现,Boost序列化中的二进制、文本和XML协议都是采用这种方式实现的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

图1-2 boost::archive::text_oarchive类的继承关系

Boost序列化的问题

 

由于C++语言的复杂性,官方文档也提到一些语言特性还存在疑难问题尚未解决:

1、右值不能被序列化。对于未跟踪的类型,可以实现这一点,但是这还没有完成;

2、指向指针的指针目前不能被序列化;

3、std::map在实现序列化时的一个细微错误已经修复。不幸的是,在不支持模板偏特化的编译器上,这个修复破坏了std::map的序列化;而且,包括指针或跟踪类型可能也无法正常工作;

4、虚基类的序列化依赖RTTI,在不支持RTTI的系统上是无法序列化的;

5、除此之外,还有一些特定编译器/库的问题。

参考文献

 

[1] Boost序列化官网,https://www.boost.org/doc/libs/1_68_0/libs/serialization/doc/index.html

[2] Boost 1.67.0源代码,https://www.boost.org/users/history/version_1_67_0.html

[3] 维基百科,https://en.wikipedia.org/wiki/Serialization

posted @ 2018-10-14 20:09  划时代  阅读(958)  评论(0)    收藏  举报