代码之家  ›  专栏  ›  技术社区  ›  joemoe

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

  •  9
  • joemoe  · 技术社区  · 16 年前

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

    6 回复  |  直到 10 年前
        1
  •  12
  •   sth    16 年前

    Boost包含 serialization library . 我自己没有用过,但通常情况下,Boost库的工作效果很好。

        2
  •  7
  •   FireAphis david.pfx    16 年前

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

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

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

    您实际上序列化了一个int类型的对象。也可以扩展此机制来支持您的自定义类。这只需重载运算符<<。它不像Java序列化那么好,但是它也非常方便。

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

        3
  •  4
  •   Marc Gravell    16 年前

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

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

        4
  •  3
  •   Tronic    16 年前

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

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

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

        5
  •  2
  •   Community Mohan Dere    8 年前

    有大量的手动咕噜工作(实际上,实现自己的侵入式或非侵入式RTTI),可以实现与C语言/ Java相媲美的自动化水平。

    请参见以下详细信息:

    How to implement serialization in C++

        6
  •  1
  •   chessmobi.com    10 年前

    我已经成功地使用了这个:

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

    它在iOS和Android上对我都很好。它是一个只包含头部的库,没有外部依赖项,因此使用非常方便。我更喜欢它而不是Boost,因为我不想导入所有Boost依赖项。这个库很小,支持XML、JSON、二进制和自定义序列化格式。

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