是否可以自动序列化C ++对象?

时间:2010-01-24 05:22:51

标签: c++ serialization persistence oop

是否有类似于C ++的Java / .NET序列化的东西?

6 个答案:

答案 0 :(得分:12)

Boost包含serialization library。我自己没有使用它,但通常升级库工作得很好。

答案 1 :(得分:7)

不幸的是,没有自动方法在C ++中序列化对象。这是因为任何序列化引擎都需要能够在运行时“理解”自定义对象,而C ++不包含必要的信息。另一方面,Java和.Net有所谓的反射。此机制允许任何人在运行时浏览任意对象的数据结构。

所有这些并不意味着没有办法用相对较少的努力来序列化C ++对象。以标准C ++流库为例。通过写作

int x = 2010;
cout << x << endl;

您实际上序列化了int类型的对象。可以扩展此机制以支持您的自定义类。这只是通过重载运算符&lt;&lt;来完成的。它不如Java序列化那么好,但它也非常方便。

还有一些库让它变得更加简单。正如有人提到的那样,boost serialization library做得很好。使用boost序列化看起来与使用iostream非常相似,但它解决了标准流固有的一些问题。

答案 2 :(得分:4)

Google的protocol buffers在核心包中提供了C ++实现;作为一个很好的好处,您可以与lots of other languages共享此数据 - 但您将仅限于使用生成的类型而不是您自己的类型(其他语言支持的某些序列化引擎)。

实际上这不是问题,因为(如果有必要)您可以将生成的类型视为与您的实际域对象相对应的DTO。

答案 3 :(得分:3)

Boost.Serialization是一个非常好的库,它还支持基本版本控制 - 这是自动序列化永远不可能实现的。因为我碰巧需要更好的版本控制,所以我实际上编写了我自己的序列化库,它遵循Boost.Serialization样式(因为Boost.Serialization的作者对改进版本没兴趣)。

请注意,如果添加了一些辅助数据,您还可以将序列化函数滥用于GUI或Web表单生成等其他目的(请参阅Boost.Serialization如何处理XML)。

需要注意的是,保存整个结构的流行方法(通过将它们转换为char *并写入sizeof(struct)字节)是完全不可移植的,它不支持版本控制,如果struct包含任何指针,它会中断或C ++(非POD)对象。

答案 4 :(得分:2)

通过大量的手动grunt工作(实际上,实现自己的侵入式或非侵入式RTTI),可以达到与C#/ Java相当的自动化水平。

请参阅此处的详细信息:

How to implement serialization in C++

答案 5 :(得分:1)

我成功使用了这个:

http://uscilab.github.io/cereal/

它在ios和android上都很适合我。它是一个仅头文件库,没有外部依赖性,因此使用起来非常方便。我更喜欢它,因为我不想导入所有的boost依赖项。该库很小,支持XML,JSON,二进制和自定义序列化格式。

库(如boost)要求您为基类显式编写一些serialiazion和反序列化代码,而集合则自动处理。