Serialization 如何在不移动数据的情况下使用零拷贝序列化库?

Serialization 如何在不移动数据的情况下使用零拷贝序列化库?,serialization,protocol-buffers,flatbuffers,Serialization,Protocol Buffers,Flatbuffers,我正在寻找一个二进制序列化库,因为JSON对于我们的用例来说太慢了。一些自由民主党人(Flatbuffers,Cap'n Proto,…)反对Protobuf,因为它没有遵循零拷贝的思想(例如和)。 当我考虑如何将这些lib集成到我们的代码中时,我看到了中“可用为可变状态”这一点的问题。 这基本上是说零拷贝特性导致(大部分)不可变对象。因此,我需要自己类中所有(或大部分)字段的副本,以便能够修改/写入数据(“可变状态”)。 在这种情况下,我将始终需要将我的内部状态复制到序列化程序对象—这感觉不像

我正在寻找一个二进制序列化库,因为JSON对于我们的用例来说太慢了。一些自由民主党人(Flatbuffers,Cap'n Proto,…)反对Protobuf,因为它没有遵循零拷贝的思想(例如和)。 当我考虑如何将这些lib集成到我们的代码中时,我看到了中“可用为可变状态”这一点的问题。 这基本上是说零拷贝特性导致(大部分)不可变对象。因此,我需要自己类中所有(或大部分)字段的副本,以便能够修改/写入数据(“可变状态”)。 在这种情况下,我将始终需要将我的内部状态复制到序列化程序对象—这感觉不像是零拷贝

Protobuf有什么不同?*我可以使用对象作为可变的内部状态(或者有什么问题吗?),从那里我只需要一个副本就可以获得序列化对象


*对于任何您不仅读取数据的用例。

如果您的用例涉及变异,那么与Protobuf相比,零拷贝库的优势确实缩小了

FlatBuffers有3种方法进行变异:

  • 如果突变仅仅是标量突变,那么它们可以就地突变(
    --gen mutable
    ),这非常有限,但也非常有效
  • 如果变异非常罕见,您仍然可以使用反射在适当的位置进行变异。这允许更多种类的突变,但使用起来又慢又复杂
  • 您可以使用对象API(
    --gen object API
    )。这将生成一个与Protobuf类似的API,它是完全可变且易于使用的,但当然会进行更多的内存分配。使用这个OuttoBuffF仍然有优势,因为API更为地道的C++,De/Fixy可能更快,如果你的系统中有一部分不需要突变,那么它们可以使用更快的底层API。