微信号:infoqchina

介绍:有内容的技术社区媒体

Microsoft开源跨平台的序列化库——Bond

2015-02-15 18:05 孙镜涛 译


上个月Microsoft开源了Bond,一个跨平台的模式化数据处理框架。Bond支持跨语言的序列化/反序列化,支持强大的泛型机制能够对数据进行有效地处理。该框架在Microsoft公司内部的高扩展服务中得到了广泛的应用。目前该项目已经基于宽松的MIT许可开源在了GitHub上,当前版本支持C++、C#和Python,可运行在Linux、OS-X和Windows平台上。Bond的编译器完全是使用Haskell编写的。


Bond与其他序列化系统具有很多相似性,例如Google Protocol BuffersThrift以及Avro

Bond使用IDL风格的语言定义消息


它会将所有的Bond数据类型映射到本地语言数据类型


但是Bond的实现有一个很大的不同:它并没有硬编码类型映射。用户能够以插件的方式定制核心架构逻辑之外的内容——是从Bond模式还是从自定义的类型序列化、有线格式是什么、是否将自定义元数据放到有效负载中等等。例如,在C++中默认是std::vector这样的STL容器,但是用户能够很容易地映射自定义的类型——在一个生成的C++结构体中使用Python的boost::multi索引容器或者在一个生成的C++类中将一个unit64模式域映射为一个System.DateTime域。Bond生成的C++结构体还能使用自定义的分配器。


Stack Overflow上的一个帖子对Bond和Google Protocol Buffers做了一个非常好的比较:


优点

Bond支持泛型


Bond有不同的类型用于表示集合:vector, map, list


Bond支持类型安全的惰性反序列化(bonded)


Bond支持多种格式(快速二进制、紧凑二进制、XML和JSON)以及封送与转码


缺点:

Bond不支持不同类型的固定、可变整数编码。在Bond中整数如何编码是由输出格式(快速二进制还是紧凑二进制)决定的,但是在Protocol Buffers中整数类型始终有固定的大小:fixed32和fixed64。


Bond不支持union类型 (Protocol Buffers支持)


Bond并没有Java实现


另外,在这个Reddit的公告中有很多与Bond的实现和能力相关的答案。


考虑到现在正在有越来越多的人以微服务的形式使用SOA,数据编组/解组的问题变得越来越重要。对于已有的序列化系统而言,Bond可以成为一个非常有用的候选方案。


 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 除了北上广深,还有哪些城市求职机会多发展快? 每周阅读清单:AsyncTask,动画,AlphaGo,Papi 酱 Android中实现Activity的启动拦截之----实现360卫士的安装应用界面 爬虫最高境界,教你用Selenium爬优酷视频评论! 月考+武汉招大数据实习生