上个月 Microsoft 开源了 Bond,一个跨平台的模式化数据处理框架。Bond 支持跨语言的序列化/反序列化,支持强大的泛型机制能够对数据进行有效地处理。该框架在 Microsoft 公司内部的高扩展服务中得到了广泛的应用。目前该项目已经基于宽松的 MIT 许可开源在了 GitHub 上,当前版本支持C++、C#和 Python,可运行在 Linux、OS-X 和 Windows 平台上。Bond 的编译器完全是使用 Haskell 编写的。
Bond 与其他序列化系统具有很多相似性,例如 Google Protocol Buffers、Thrift 以及 Avro:
但是 Bond 的实现有一个很大的不同:它并没有硬编码类型映射。用户能够以插件的方式定制核心架构逻辑之外的内容——是从 Bond 模式还是从自定义的类型序列化、有线格式是什么、是否将自定义元数据放到有效负载中等等。例如,在 C++ 中默认是 std::vector 这样的 STL 容器,但是用户能够很容易地映射自定义的类型——在一个生成的 C++ 结构体中使用 Python 的 boost::multi 索引容器或者在一个生成的 C++ 类中将一个 unit64 模式域映射为一个 System.DateTime 域。Bond 生成的 C++ 结构体还能使用自定义的分配器。
Stack Overflow 上的一个帖子对 Bond 和 Google Protocol Buffers 做了一个非常好的比较:
优点:
缺点:
另外,在这个 Reddit 的公告中有很多与 Bond 的实现和能力相关的答案。
考虑到现在正在有越来越多的人以微服务的形式使用 SOA,数据编组/解组的问题变得越来越重要。对于已有的序列化系统而言,Bond 可以成为一个非常有用的候选方案。