C++;支持部分序列化的序列化库? 有没有支持部分序列化的优秀的现有C++序列化库?< /P>

C++;支持部分序列化的序列化库? 有没有支持部分序列化的优秀的现有C++序列化库?< /P>,c++,serialization,boost,protocol-buffers,partial,C++,Serialization,Boost,Protocol Buffers,Partial,所谓“部分序列化”,我的意思是我可能希望保存3个特定成员的值,然后能够将保存的副本应用到其他实例。我只更新这3个成员,其他成员保持不变 这对于通过网络同步数据非常有用。假设我在客户端和服务器上有某个对象,当服务器上的某个成员发生更改时,我希望向客户端发送一条消息,其中包含该成员和该成员的更新值。我不想通过电线发送整个物体的副本 乍一看,它似乎只支持全部或全部不支持 编辑:在最初写这篇文章3年后,我回过头来对自己说,‘wut?’boost::serialization允许您定义要保存或不保存的成员

所谓“部分序列化”,我的意思是我可能希望保存3个特定成员的值,然后能够将保存的副本应用到其他实例。我只更新这3个成员,其他成员保持不变

这对于通过网络同步数据非常有用。假设我在客户端和服务器上有某个对象,当服务器上的某个成员发生更改时,我希望向客户端发送一条消息,其中包含该成员和该成员的更新值。我不想通过电线发送整个物体的副本

乍一看,它似乎只支持全部或全部不支持


编辑:在最初写这篇文章3年后,我回过头来对自己说,‘wut?’boost::serialization允许您定义要保存或不保存的成员,因此它将支持我所描述的‘部分序列化’。此外,由于C++缺乏反射序列化库,因此需要明确地指定保存的每个成员,除非它们带有某种外部工具来解析源文件或具有用于生成C++代码的单独输入文件格式(例如,什么协议缓冲区)。我想我写这篇文章时一定是在概念上搞糊涂了。

虽然我对它们不熟悉,但您也可以查看。

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

序列化是保存一个对象,然后从字节流中重新创建它。认为视频游戏保存了Web服务器的会话上下文

这里你需要的是信息。这很好。将包含每个字段的消息指定为可选消息,在收到消息后,使用确实存在的字段更新对象,并保留其他字段不变

FlatBuffers的优点在于,它可以很好地处理向前和向后兼容性,以及文本和二进制编码(文本对于调试来说非常好,二进制对于纯性能来说更好),这是一个零成本解析步骤


如果您将消息保存在某个地方,并且希望组合一个html gui来检查它,那么您甚至可以使用另一种语言(比如python或ruby)对消息进行解码

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