【问题标题】:Serialize/ Deserialize C++ classes序列化/反序列化 C++ 类
【发布时间】:2013-10-12 22:08:37
【问题描述】:

我正在寻找一种在 2 个客户端应用程序之间发送 C++ 类的方法。 我一直在寻找这样做的方法,我能找到的只是我需要为每个类序列化/反序列化(例如 JSON)函数创建并通过 TCP/IP 发送它。 我面临的主要问题是我需要传递大约 600 个类(其中一些是包括其他类的实例的类),这意味着我需要花费下一次编写序列化/反序列化函数。

是否有任何通用的方法来编写序列化/反序列化函数? 还有其他发送 C++ 类的方法吗?

谢谢, 盖伊·厄加斯。

【问题讨论】:

  • Thrift 并不是一个糟糕的选择。它会根据简单易学的 IDL 语法为您生成反序列化代码。一个警告可能是 Thrift 中的类型之间不能有前向或循环引用。如果这不适用于您,Thrift 可能是您的首选工具。

标签: c++ json serialization boost thrift


【解决方案1】:

如果你是linux平台,可以直接使用json.h库进行序列化。 这是我遇到的示例代码:)

Json Serializer

【讨论】:

    【解决方案2】:

    您可能对 ASN.1 感兴趣。它不一定是最容易使用的,而且工具/库有点难以获得(http://www.obj-sys.com/index.php 的 Objective Systems 值得一看,虽然不是免费的)。

    然而,最大的优势是它非常标准化(因此不会出现库版本不兼容的问题),并且大多数语言都以一种或另一种方式支持。如果您需要跨多个平台的支持,这将非常方便。它还进行二进制编码,因此它比 XML(它也支持)更不臃肿。出于这些原因,我选择了它,并没有后悔。

    【讨论】:

    • 来自维基百科:Abstract Syntax Notation One (ASN.1) 是一种标准和符号,用于描述在电信和计算机网络中表示、编码、传输和解码数据的规则和结构。形式化规则可以表示独立于机器特定编码技术的对象。
    【解决方案3】:

    增强序列化
    虽然我自己没用过,但在工作中很受同行的欢迎。
    有关它的更多信息可以在"Boost (1.54.00) Serialization"找到。

    节俭
    Thrift 的序列化功能非常有限,我认为它不符合您的要求。但它可以帮助您将数据从一个客户端“移动”到另一个客户端,即使他们使用不同的语言。
    有关它的更多信息可以在"Thrift: The Missing Guide"找到。

    【讨论】:

    • Thrift 确实具有序列化功能(这就是它被定位为 RPC 和序列化框架的原因)。从技术上讲,序列化或多或少是一种附加效果,因为 RPC 无论如何都需要它。
    • @JensG :Thrift 序列化仅适用于一些基本类型和常见数据结构(map、set 和 list),但它没有针对用户自定义类的开箱即用序列化。
    • 这取决于您所称的用户定义的自定义类。 Thrift 允许您定义的结构,然后将其转换为类。它可能不符合您的需求,但它具有序列化支持,与答案所说的相反。
    【解决方案4】:

    试试s11n 或nosjob

    s11n(序列化的缩写)是一个开源项目 专注于对象的通用序列化(即对象 持久性)在 C++ 编程语言中。

    nosjob,一个用于生成和使用 JSON 数据的 C++ 库。

    【讨论】:

      【解决方案5】:

      您是否在使用框架?例如,Qt 和 MFC 内置了序列化,这将使您的任务更容易。否则,我猜您至少需要在 600 个课程中的每一个上花费一些精力。

      正如上面推荐的,Boost Serialization 可能是一个不错的方法,您也可以使用 Boost Asio 通过 Tcp 发送序列化类: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio.html

      另外,还有一个用于 Google 协议缓冲区 (protobuf) 的 C++ API: https://developers.google.com/protocol-buffers/docs/reference/cpp/

      【讨论】:

        猜你喜欢
        • 2016-06-15
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 2012-02-02
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多