是否可以在C++中序列化和反序列化一个类?
我已经使用Java 3年了,序列化/反序列化在这种语言中相当简单.C++有类似的功能吗?是否有处理序列化的本机库?
一个例子会有所帮助.
该Boost::serialization
库处理这个相当典雅.我在几个项目中使用过它.这里有一个例子程序,说明如何使用它,在这里.
唯一的本地方法是使用流.这基本上就是所有Boost::serialization
库所做的,它通过设置框架将对象写入类似文本的格式并使用相同的格式读取它来扩展stream方法.
对于内置类型,或者您自己的类型operator<<
和operator>>
正确定义,这相当简单; 有关更多信息,请参阅C++ FAQ.
我意识到这是一个老帖子,但它是搜索时出现的第一个帖子c++ serialization
.
我鼓励任何有权使用C++ 11的人来看看Grain,这是一个C++ 11头文件库,用于序列化,支持开箱即用的二进制,JSON和XML.谷物的设计易于扩展和使用,并具有与Boost类似的语法.
提升是一个很好的建议.但如果你想自己动手,那就不那么难了.
基本上,您只需要一种方法来构建对象图,然后将它们输出为某种结构化存储格式(JSON,XML,YAML等等).构建图形就像利用标记递归体面对象算法然后输出所有标记对象一样简单.
我写了一篇文章描述了一个基本的(但仍然很强大的)序列化系统.您可能会觉得有趣:使用SQLite作为磁盘文件格式,第2部分.
至于"内置"图书馆去了,<<
并>>
已进行序列化特别保留.
您应该覆盖<<
以将对象输出到某个序列化上下文(通常是一个iostream
)并>>
从该上下文中读取数据.每个对象负责输出其聚合的子对象.
只要对象图不包含循环,此方法就可以正常工作.
如果是,那么您将不得不使用库来处理这些周期.
我推荐Google 协议缓冲区.我有机会在一个新项目上测试驱动库,它非常容易使用.该库针对性能进行了大量优化.
Protobuf与其他序列化解决方案的不同之处在于它不会对您的对象进行序列化,而是根据您的规范为序列化的对象生成代码.
Boost :: serialization是一个很好的选择,但是我遇到了一个新项目:我发现它更优雅的谷歌!我强烈建议调查它.