最近(2015年1月)Microsoft开源的Bond,这是他们处理架构数据的框架。在许多方面,它类似于谷歌的协议缓冲区。
两者之间最大的区别是什么?什么是优缺点,也就是说,在哪些情况下我想使用一个,而不是另一个?当然,我不是在谈论明显的事情,比如与其他项目或已经存在的 API 的一致性,而是两个库的功能。举个例子,邦德有bonded<T>
,如果我没记错的话,它在协议缓冲区中没有对应物。
一般来说,邦德有更好的类型系统,支持多种协议。
特别是,优点是:
- 债券支持泛型
- 邦德有不同的类型来表示集合:
vector<T>
、map<T>
、list<T>
- 绑定支持类型安全的延迟反序列化 (
bonded<T>
) - Bond 支持多种格式(快速二进制、紧凑二进制、XML、JSON)+ 封送和转码
缺点:
- 债券不支持不同类型的固定和可变整数编码。在 Bond 中,整数的编码方式由输出格式(快速或紧凑)决定,但在协议缓冲区中,有一些整数类型始终具有固定大小:
fixed32
和fixed64
。 - 绑定不支持联合类型(协议缓冲区中的
oneof
)
我做了一些测试,看起来邦德和ProtoBuf二进制格式的简单消息的大小大致相同。我比较了使用 Bond 和 C# ProtoBuf 库的序列化和反序列化时间:在我的情况下,Bond 的性能要好一些,你可以在 GitHub 上找到我的源代码
总而言之,我认为当您处理一些复杂类型的数据或需要以不同格式表示相同数据时,最好使用 Bond:例如存储为二进制文件,但公开为 JSON 等。