上个月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可以成为一个非常有用的候选方案。

Microsoft开源跨平台的序列化库——Bond的更多相关文章

  1. 开源跨平台声波传输库:Sonic

    简介 [Sonic](https://github.com/linyehui/sonic) 是一个跨平台的声波传输库(iOS & Android),技术上类似于[chirp](http://c ...

  2. AngouriMath: 用于C#和F#的开源跨平台符号代数库

    AngouriMath是一个MIT协议开源符号代数库.也就是说,通过AngouriMath,您可以自动求解方程.方程组.微分.从字符串解析.编译表达式.处理矩阵.查找极限.将表达式转换为LaTeX,以 ...

  3. cereal:C++实现的开源序列化库

    闲来无事发现了一个基于C++实现的序列化工具,相比于其他(比如Boost serialization或Google protobuf,恰巧都用过,以后再介绍),使用简单,感觉不错,下面做个摸索. ce ...

  4. C++的开源跨平台日志库glog学习研究(三)--杂项

    在前面对glog分别做了两次学习,请看C++的开源跨平台日志库glog学习研究(一).C++的开源跨平台日志库glog学习研究(二)--宏的使用,这篇再做个扫尾工作,算是基本完成了. 编译期断言 动态 ...

  5. C++的开源跨平台日志库glog学习研究(二)--宏的使用

    上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. ...

  6. 最全面的iOS和Mac开源项目和第三方库汇总

    标签: UI 下拉刷新 EGOTableViewPullRefresh – 最早的下拉刷新控件. SVPullToRefresh – 下拉刷新控件. MJRefresh – 仅需一行代码就可以为UIT ...

  7. Ptypes一个开源轻量级的c++库,包括对一些I/O操作、网络通信、多线程和异常处理的封装

    C++开源项目入门级:Ptypes    Ptypes一个开源轻量级的c++库,包括对一些I/O操作.网络通信.多线程和异常处理的封装.虽然代码有限,包括的内容不少,麻雀虽小,五脏俱全.    提高: ...

  8. .NET Core:面向未来的开源跨平台开发技术

    作为一种全新的开源和跨平台的开发平台,.NET Core 历经两年多的开发,终于在于2016年6月27日针对所有主流服务器和桌面操作系统发布 1.0 RTM 版本..NET Core 是一种通用开发平 ...

  9. C++序列化库的实现

    C++中经常需要用到序列化与反序列化功能,由于C++标准中没有提供此功能,于是就出现了各式各样的序列化库,如boost中的,如谷歌的开源项目,但是很多库都依赖其他库过于严重,导致库变得很庞大.今天来分 ...

随机推荐

  1. PHP发送短信功能

    发送短信的功能主要在于获得短信接口后,在函数中模仿用户行为,例如浏览器跳转输出短信接口的链接. 需要运用的函数为 curl_init(); curl_setopt(); curl_exec(); cu ...

  2. 使用静态函数impl模式做接口

    使用静态函数impl模式做接口 impl即桥接模式,主要是为了隐藏数据和减少不必要的编译. 普通的impl模式做接口一般是: A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B ...

  3. yum 源

    epel 6源: cd /usr/local/src wget https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noar ...

  4. UVA 11768 Lattice Point or Not(扩展欧几里德)

    将直线转化为ax + by = c的形式,然后扩展欧几里得求在[x1, x2]之间的解 对直线与坐标轴平行的特判 调试了好长时间,注意: 1 正负数转化为整型的处理 2 注意判断有无解 #includ ...

  5. Problem with "AnyConnect was not able to establish connection to the specified secure gateway."

    Cisco的VPN客户端最近报"AnyConnect was not able to establish connection to the specified secure gateway ...

  6. Android 笔记 Intent and Bundle day7

    学习了Intent与Bundle的使用,进行应用中的交互 package com.example.intent; import android.app.Activity; import android ...

  7. 第二十二篇:在SOUI中使用代码向窗口中插入子窗口

    使用SOUI开发客户端UI程序,通常也推荐使用XML代码来创建窗口,这样创建的窗口使用方便,当窗口大小改变时,内部的子窗口也更容易协同变化. 但是最近不断有网友咨询如何使用代码来创建SOUI子窗口,特 ...

  8. 【学习篇:他山之石,把玉攻】jquery实现调用webservice

    1.webservice端 using System; using System.Collections.Generic; using System.Web; using System.Web.Ser ...

  9. 用opencsv文件读写CSV文件

    首先明白csv文件长啥样儿: 用excel打开就变成表格了,看不到细节 推荐用其它简单粗暴一点儿的编辑器,比如Notepad++, csv文件内容如下: csv文件默认用逗号分隔各列. 有了基础的了解 ...

  10. 一个神奇的POS -扫描 现场销售 开单打印票据 安卓物联网POS机 手持开单终端机 省时省力 高效准确!!

    5寸高清彩屏,高端大气上档次,小巧轻便,独特的包胶防护,坚固耐用,外形精细,美观!与软件灵活对接,解决企业手工盘点,手工输单,库存管理等困难,提高准确率,提高工作效率!! 应用领域:适用于仓库.超市. ...