微软的Bond和谷歌的Protocol Buffers之间的区别

34

最近(2015年1月),微软开源了其用于处理经过计划的数据的 Bond 框架。在许多方面,它与谷歌的Protocol Buffers相似。

这两者之间最大的区别是什么?它们的优缺点是什么?在哪些情况下我会使用其中一个而不是另一个呢?当然,我不是在谈论与其他项目或已有API的一致性等明显的事情,而是指两个库的特点。举个例子,Bond 有 bonded<T>,如果我没记错的话,在 Protocol Buffers 中没有类似物。


已经相当详细地介绍了 - Hans Passant
@HansPassant 感谢您指出这一点(我不知道我怎么会错过那个页面)。另一方面,我认为能够听到框架创建者以外的其他人的声音也是很棒的。 - dtldarek
@HansPassant,不,它没有清楚地提供性能基准。 - sorosh_sabz
1个回答

45

总的来说,Bond具有更好的类型系统并支持多个协议。

具体而言,其优点包括:

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

缺点:

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

我进行了一些测试,发现在Bond和ProtoBuf二进制格式中,简单消息的大小大约相同。我使用Bond和C# ProtoBuf库比较了序列化和反序列化时间:在我的情况下,Bond表现稍微更好,你可以在GitHub上查找我的源代码

总之,我认为在处理某些复杂类型的数据或需要以不同格式表示相同数据时(例如存储为二进制文件,但以JSON格式公开),最好使用Bond。


你有一个简单的测试来证明这个吗? - mjsabby
2
@mjsabby,您想要看什么?您可以在此处找到我的代码:https://github.com/takemyoxygen/bond-performance-tests - takemyoxygen
Java现在是一种受支持的编程语言。 - Jon Travis
请为压缩添加性能基准测试。 - sorosh_sabz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接