微软的债券和谷歌的协议缓冲区之间的差异

时间:2015-01-10 17:47:35

标签: serialization marshalling protocol-buffers bond

最近(2015年1月)Microsoft开源Bond,它们用于处理模式化数据的框架。在许多方面,它类似于Google的Protocol Buffers

两者之间最大的区别是什么?什么是利弊,也就是说,在哪种情况下我想使用一种,而不是另一种情况?当然,我并不是在谈论与其他项目或现有API的一致性等明显的事情,而是两个库的功能。举个例子,Bond有bonded<T>,如果我没记错的话,它在协议缓冲区中没有对应物。

1 个答案:

答案 0 :(得分:29)

一般来说,邦德有更好的类型系统并支持多种协议。

特别是,职业选手是:

  • Bond支持泛型
  • Bond有不同的类型来代表集合:vector<T>map<T>list<T>
  • Bond支持类型安全的惰性反序列化(bonded<T>
  • Bond支持多种格式(快速二进制,紧凑二进制,XML,JSON)+编组和转码

缺点:

  • Bond不支持固定和可变整数编码的不同类型。在Bond中,整数的编码方式由输出格式(快速或紧凑)决定,但在协议缓冲区中,有一些整数类型始终具有固定大小:fixed32fixed64
  • Bond不支持联合类型(协议缓冲区中的oneof
  • Bond尚未实施Java(

我做了一些测试,看起来Bond和ProtoBuf二进制格式的简单消息大小差不多。我使用Bond和C#ProtoBuf库来比较序列化和反序列化时间:在我的情况下,Bond表现得更好,你可以找到我的source code on GitHub

总而言之,我认为在处理一些复杂类型的数据时或者当您需要以不同格式表示相同数据时,最好使用Bond:存储为二进制文件,但以JSON等方式公开。