微软的 Bond 和 Google 的 Protocol Buffers 之间的区别

Difference between Microsoft's Bond and Google's Protocol Buffers

最近(2015 年 1 月)Microsoft 开源了 Bond, their framework for working with schematized data. In many aspects it is similar to Google's Protocol Buffers

两者最大的区别是什么?什么是优点和缺点,即在哪些情况下我想使用一种而不是另一种?当然,我不是在谈论明显的事情,比如与其他项目或现有 API 的一致性,而是两个库的特性。举个例子,Bond 有 bonded<T>,如果我没记错的话,它在 Protocol Buffers 中没有对应的

总的来说,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 表现得更好一些,你可以找到我的 source code on GitHub

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