是否有可能序列化和反序列化在C + +的类?

是否有可能序列化和反序列化在C + +的类?

我已经使用Java 3年了,序列化/反序列化在这个语言中是相当平凡的。 C ++有类似的function吗? 是否有处理序列化的本机库?

一个例子会有帮助。

Boost::serialization库处理这个相当优雅。 我用它在几个项目。 有一个示例程序, 在这里显示如何使用它。

唯一的原生方法是使用stream。 这本质上就是Boost::serialization库所做的全部function,它通过设置一个框架来将对象编写成类似文本的格式并从相同格式读取它们,从而扩展了stream方法。

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

我意识到这是一个旧的post,但它是searchc++ serialization时出现的第一个。

我鼓励任何有权访问C ++ 11的人都去看看谷仓 ,一个C ++ 11头文件库,用于支持二进制,JSON和XML的序列化。 谷物被devise成易于扩展和使用,并且具有与Boost类似的语法。

Boost是一个很好的build议。 但是如果你想自己推出,这并不难。

基本上你只需要一种方法来build立一个对象的graphics,然后输出到一些结构化的存储格式(JSON,XML,YAML等等)。 构buildgraphics就像使用标记recursion的不错的对象algorithm,然后输出所有标记的对象一样简单。

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

我推荐Google 协议缓冲区 。 我有机会在一个新的项目上试驾图书馆,这非常容易使用。 该库对性能进行了大量优化。

Protobuf与此处提到的其他序列化解决scheme不同,它不会序列化对象,而是根据您的规范生成序列化对象的代码。

Boost :: serialization是一个不错的select,但是我遇到了一个新的项目: 谷物 ,我发现它更优雅! 我强烈build议调查一下。

就“内置”库而言, <<>>都专门用于序列化。

你应该覆盖<<将你的对象输出到一些序列化上下文(通常是一个iostream )和>>从这个上下文中读回数据。 每个对象负责输出其聚集的子对象。

只要你的对象图不包含循环,这个方法就可以正常工作。

如果是这样,那么你将不得不使用一个库来处理这些周期。

你可以检查一下amef协议, amef中C ++编码的例子就好像,

  //Create a new AMEF object AMEFObject *object = new AMEFObject(); //Add a child string object object->addPacket("This is the Automated Message Exchange Format Object property!!","adasd"); //Add a child integer object object->addPacket(21213); //Add a child boolean object object->addPacket(true); AMEFObject *object2 = new AMEFObject(); string j = "This is the property of a nested Automated Message Exchange Format Object"; object2->addPacket(j); object2->addPacket(134123); object2->addPacket(false); //Add a child character object object2->addPacket('d'); //Add a child AMEF Object object->addPacket(object2); //Encode the AMEF obejct string str = new AMEFEncoder()->encode(object,false); 

在Java解码会像,

  string arr = amef encoded byte array value; AMEFDecoder decoder = new AMEFDecoder() AMEFObject object1 = AMEFDecoder.decode(arr,true); 

Protocol实现了C ++和Java的编解码器,有趣的部分是它可以保留名称值对的forms的对象类表示,我需要一个类似的协议在我的最后一个项目,当我偶然地偶然发现了这个协议,根据我的要求修改基础库。 希望这可以帮助你。

我build议使用其他海报描述的boost序列化。 下面是一个关于如何使用它的好的详细教程,它很好地补充了boost教程: http : //www.ocoudert.com/blog/2011/07/09/a-practical-guide-to-c-serialization/

甜蜜坚持是另一个。

可以使用XML,JSON,Lua和二进制格式来序列化stream。

我build议寻找经常用作序列化基础的抽象工厂

我已经在另一个有关C ++工厂的问题中回答了。 如果一个灵活的工厂感兴趣,请看那里 。 我尝试从ET ++中描述一种老式的方式来使用对我来说很好的macros。

ET ++是一个将旧的MacApp移植到C ++和X11的项目。 Eric Gamma等人开始考虑devise模式 。 ET ++包含了在运行时序列化和自省的自动方法。