2009-11-27 35 views
3

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

通过“局部串行”我的意思是,我可能要保存的3个特定成员的值,以后还可以到保存的副本适用于不同的实例。我只会更新这3个成员,并保留其他成员。

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

boost::serialization一眼看起来像它仅支持全有或全无。

编辑:3年后最初写这个我回头看它,我对自己说,“武汉理工大学?” boost :: serialization可以让你定义你想要保存或不保存的成员,所以它会支持'部分序列化',正如我似乎已经描述的那样。此外,由于C++缺乏反射序列化库,因此要求您明确指定要保存的每个成员,除非他们带有某种外部工具来解析源文件或具有用于生成C++代码的单独输入文件格式(例如什么协议缓冲区)。我认为我写这篇文章时一定会在概念上感到困惑。

回答

4

你很显然没有在这里寻找序列化。

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

这里你需要的是消息。 Google's FlatBuffers对此很好。在接收到消息时指定一个将包含每个字段作为可选字段的消息,使用存在的字段更新您的对象,并保持其他字段不变。

FlatBuffers最棒的地方在于,它能够很好地处理向前和向后兼容性,以及文本和二进制编码(文本对于调试非常有用,二进制对于纯性能更好),在零成本解析步骤之上。

你甚至可以用另一种语言解码的消息(比如Python或Ruby),如果你的地方保存,并希望一起扔一个HTML GUI来检查它!

+0

我不会说我“显然不想要序列化”。也许序列化库通常不会考虑这种用例,但我认为这是完全序列化的一个非常自然的扩展,希望能够仅保存对象成员的一个子集。通过网络发送数据只是一种可能的用例。 –

+0

我的意思不是迂腐,但序列化是关于保存足够的信息,以便能够从中重建语义相同的克隆。这些属性的子集可能就足够了(如果可以计算其余的)。然而在这里,我们有一个不同的案例:它真的是更多的观察者模式。观察者模式实际上是关于沟通......所以我们正在谈论事件(或消息)。是否涉及网络并不重要(尽管它有点复杂)。 –

+0

我的意思并不是迂腐,但是如果序列化节省了足够的信息来创建语义相同的克隆,部分序列化可以节省足够的信息以创建部分语义相同的“克隆”;)或者相同,比原来窄)的观点。 –