【问题标题】:C++ serialization library that supports partial serialization? [closed]支持部分序列化的 C++ 序列化库? [关闭]
【发布时间】:2009-11-27 19:38:22
【问题描述】:

是否有任何支持部分序列化的现有 C++ 序列化库?

“部分序列化”是指我可能想要保存 3 个特定成员的值,然后可以将保存的副本应用到不同的实例。我只会更新这 3 个成员,而其他成员保持不变。

这对于通过网络同步数据很有用。假设我在客户端和服务器上有一些对象,当服务器上的成员发生更改时,我想向客户端发送一条消息,其中包含该成员的更新值并且仅限该成员。我不想通过网络发送整个对象的副本。

boost::serialization乍一看好像只支持all or nothing。

编辑:在最初写这篇文章 3 年后,我回顾它并自言自语,'wut? boost::serialization 允许您定义要保存或不保存的成员,因此它支持“部分序列化”,正如我所描述的那样。此外,由于 C++ 缺少反射序列化库,因此需要您明确指定要保存的每个成员,除非它们带有某种外部工具来解析源文件或具有用于生成 C++ 代码的单独输入文件格式(例如协议缓冲区做什么)。我想我在写这篇文章时一定是在概念上感到困惑。

【问题讨论】:

    标签: c++ serialization boost protocol-buffers partial


    【解决方案1】:

    你显然不是在这里寻找序列化。

    序列化是关于保存一个对象,然后从字节流中重新创建它。想想视频游戏保存或网络服务器的会话上下文。

    您需要的是消息传递。 Google's FlatBuffers 很好。将包含每个字段的消息指定为可选,在收到消息后,使用确实存在的字段更新您的对象,而其他字段保持不变。

    FlatBuffers 的优点在于它可以很好地处理前向和后向兼容性,以及文本和二进制编码(文本非常适合调试,二进制更适合纯粹的性能),在零成本解析步骤之上。

    如果您将消息保存在某个地方并希望将它们放在一起 html gui 来检查它,您甚至可以使用另一种语言(例如 python 或 ruby​​)解码消息!

    【讨论】:

    • 我不会说我“显然不是在寻找序列化”。也许序列化库通常不会考虑这个用例,但我认为希望能够只保存对象成员的子集是完全序列化的一个非常自然的扩展。通过网络发送数据只是一种可能的用例。
    • 我并不是要显得迂腐,但序列化是为了保存足够的信息,以便您能够从中重建语义相同的克隆。属性的一个子集可能就足够了(如果你可以计算其余的)。然而,这里我们有一个不同的情况:它实际上更像是一种观察者模式。观察者模式实际上是关于交流的……所以我们谈论的是事件(或消息)。是否涉及网络并不重要(尽管它使事情有点复杂)。
    • 我也不想显得迂腐,但如果序列化保存了足够的信息来创建语义相同的克隆,部分序列化可以保存足够的信息来创建部分语义相同的“克隆”;)或者更确切地说,从某些(比原始的)角度来看是相同的。
    • @MatthieuM。维基百科说“Protocol Buffers 是一种序列化结构化数据的方法。因此,它们在开发程序以通过线路相互通信或存储数据时很有用。” 与他们的definition of serialization 一致,但是 Boost 说 “在这里,我们使用术语'序列化'来表示将任意 C++ 数据结构集可逆地解构为字节序列。” 也许插入器/提取器的惯用 C++ 概念更多符合那个序列化的定义,还有其他的。
    • @DmitryVolosnykh:确实;这就是为什么现在图书馆推荐不被接受为问题 => 答案往往会随着时间的推移而退化。
    【解决方案2】:

    虽然我不熟悉,但你也可以看看Google's Protocol Buffers

    【讨论】:

      猜你喜欢
      • 2014-12-29
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多