当前位置:  开发笔记 > 编程语言 > 正文

是否可以在C++中序列化和反序列化一个类?

如何解决《是否可以在C++中序列化和反序列化一个类?》经验,为你挑选了6个好方法。

是否可以在C++中序列化和反序列化一个类?

我已经使用Java 3年了,序列化/反序列化在这种语言中相当简单.C++有类似的功能吗?是否有处理序列化的本机库?

一个例子会有所帮助.



1> Head Geek..:

Boost::serialization库处理这个相当典雅.我在几个项目中使用过它.这里有一个例子程序,说明如何使用它,在这里.

唯一的本地方法是使用流.这基本上就是所有Boost::serialization库所做的,它通过设置框架将对象写入类似文本的格式并使用相同的格式读取它来扩展stream方法.

对于内置类型,或者您自己的类型operator<<operator>>正确定义,这相当简单; 有关更多信息,请参阅C++ FAQ.


特定的框架/库解决方案不应成为公认的答案。
@Andrea:Boost库是一个特例.在C++ 11最终确定之前,如果没有它,编写现代C++代码几乎是不可能的,因此它比单独的库更接近辅助STL.

2> Azoth..:

我意识到这是一个老帖子,但它是搜索时出现的第一个帖子c++ serialization.

我鼓励任何有权使用C++ 11的人来看看Grain,这是一个C++ 11头文件库,用于序列化,支持开箱即用的二进制,JSON和XML.谷物的设计易于扩展和使用,并具有与Boost类似的语法.


关于谷物的好处是,与boost不同,它具有最少的元数据(几乎没有).每次打开存档时,boost :: serialization都会变得非常烦人,它会将其lib版本写入流中,这使得追加文件变得不可能.

3> Frank Kruege..:

提升是一个很好的建议.但如果你想自己动手,那就不那么难了.

基本上,您只需要一种方法来构建对象图,然后将它们输出为某种结构化存储格式(JSON,XML,YAML等等).构建图形就像利用标记递归体面对象算法然后输出所有标记对象一样简单.

我写了一篇文章描述了一个基本的(但仍然很强大的)序列化系统.您可能会觉得有趣:使用SQLite作为磁盘文件格式,第2部分.



4> Frank Kruege..:

至于"内置"图书馆去了,<<>>已进行序列化特别保留.

您应该覆盖<<以将对象输出到某个序列化上下文(通常是一个iostream)并>>从该上下文中读取数据.每个对象负责输出其聚合的子对象.

只要对象图不包含循环,此方法就可以正常工作.

如果是,那么您将不得不使用库来处理这些周期.


当然,这是不对的...实现的`<<`运算符用于打印对象的人类可读文本表示,这通常不是您想要的序列化.
我认为这里很重要_“您应该重写`<<`以将您的对象输出到某个序列化上下文中……每个对象都负责输出其序列…” _ —问题在于如何避免必须为每个对象费力地将其写出对象:语言或库有多少帮助?

5> yoav.aviram..:

我推荐Google 协议缓冲区.我有机会在一个新项目上测试驱动库,它非常容易使用.该库针对性能进行了大量优化.

Protobuf与其他序列化解决方案的不同之处在于它不会对您的对象进行序列化,而是根据您的规范为序列化的对象生成代码.


您是否有使用此序列化大小为10-50MB的对象的经验?文档似乎说协议缓冲区最适合大小为MB的对象.

6> M2tM..:

Boost :: serialization是一个很好的选择,但是我遇到了一个新项目:我发现它更优雅的谷歌!我强烈建议调查它.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有