作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
安德烈斯米尔诺夫
验证专家 在工程

Andrei在微软这样的公司工作了15年以上, EMC, 摩托罗拉, 以及德意志银行(Deutsche Bank)的手机业务, 桌面, 和web使用c++, C#, 和JS.

以前在

微软
分享

微软公司债券 是微软为模式化数据创建的一个新的序列化框架吗.

让我们回顾一下数据序列化最常用的地方:

  • 文件、流、NoSQL和大数据中的数据持久化.
  • 网络中的数据传输,IPC等.

通常,这些应用程序必须处理模式化的数据,其中模式意味着:

  • 结构:等级、关系、秩序.
  • 语义:从出生到现在的年龄.

微软债券数据序列化框架

实际上, 任何数据都有模式,即使它是隐式定义的或由编程语言支持的. 当涉及到复杂的数据结构时, 我们最终编写支持数据传输对象(dto)和负责IO的代码, 通常用不同的语言. 一旦它成长和发展,维护所有这些部分很快就会变成一场噩梦. 这就是序列化框架获胜的地方.

首先, 任何序列化框架都为数据模式定义定义了一个抽象,它不绑定到特定的编程语言或平台. 这种抽象被称为 DSL(领域特定语言).

有了这样一个DSL,我们就可以为特定的应用程序定义数据模式. 的定义, 反过来, 能以多种形式表达吗, 但是序列化框架通常支持一种非常适合其DSL的形式. 太复杂? 这里有一个众所周知的例子:XSD和XML.

XSD定义了DSL, XML(推荐)用于定义与XSD模式匹配的文档. 但是,您也可以使用“xsd”.生成与XSD匹配的DTO类,因此生成的类只是另一种形式. 请注意,您可以从dto生成XML,反之亦然,它们在语义上是相同的, 因为语义是通用的:它是用XSD定义的. 总结, 序列化框架为您提供DSL, 您使用哪种格式来定义给定框架最支持的特定格式的数据模式.

抽象的数据模式最终将具体化为一组用编程语言表示的实体. 所有序列化框架都提供了称为代码生成器的特殊工具.

它们生成目标编程语言的所有支持代码, 客户端需要使用哪些模式化数据:dto, 代理, 等. 这是强类型语言最终需要的, 而对于鸭子类型(动态)语言来说,它可能是可选的.

最后但并非最不重要的是在线上的数据持久性. 实际数据最终将被序列化成原始字节(或文本),然后反序列化回来.

所有数据序列化框架都提供了另一种抽象,在这里称为协议. 协议定义了一组规则,这些规则定义了结构化数据应该如何根据其模式进行序列化或反序列化. 每个协议通常针对给定序列化框架支持的所有编程语言和平台实现. 它支持的编程语言/平台越多,它应该提供的实现就越多.

假设有一个框架愿意支持JSON协议, 那么它必须为c#提供JSON阅读器/写入器, C++, 窗户, Linux, 等.

把所有这些放在一起:任何现代数据序列化框架都提供以下功能:

  • 抽象:DSL和协议.
  • 代码生成工具.
  • 协议的实现.

微软公司债券是一个现代数据序列化框架. 它提供了强大的DSL和灵活的协议,c++和 C#窗户、Linux和Mac OS X的高效协议实现.

几年来, Bond仍然是一种内部使用的技术, 但多亏了微软的开源计划, Bond已在GitHub上提供: 微软公司债券.

数据序列化竞争对手

软件巨头之间的竞争导致了一系列序列化框架的出现:

很明显, 它们都是不相容的, 这是可以的,除非你的公共API使用这些.

每一种都有优点和缺点,所以你可以根据自己的需要进行选择.

为什么债券?

这个问题的官方答案如下: “为什么债券”.

下面是简短的总结:

  • Bond支持富类型系统,包括泛型.
  • Bond支持模式版本控制和双向兼容性.
  • Bond支持运行时模式操作.
  • Bond支持各种集合:“vector”、地图、列表”.
  • Bond支持类型安全的惰性序列化
  • Bond支持带封送和转码的可插拔协议(格式)

值得注意的是,邦德遵循的是“付费游戏”策略. 你添加/使用的功能越多,你为大小和速度付出的代价就越高. 这为开发人员提供了很大的灵活性.

让我们诚实地列出缺点:

  • 邦德的目标是 微软堆栈支持c++C#,但不支持Java(目前).
  • Bond不支持联合类型(protobuf中的" oneof ").

性能怎么样??

当涉及到比较一个框架和另一个框架时, 开发人员 经常寻找绩效比较. 但是让我们回忆一下,这些框架由DSL、代码生成器和协议组成. 如果只考虑协议性能, 那么你就会错过DSL和编码所提供的特性. 有时, 拥有更好的DSL比在序列化速度上有几个百分点的差异要重要得多.

除了速度之外,某些协议支持的空间高效编码也很重要. 我鼓励您对特定领域的数据进行性能/空间比较. 这是估计您可以从特定框架中获得的所有好处的唯一方法.

微软公司债券

本文随附 演示项目 通过从窗户应用程序事件日志中读取所有记录来演示Bond框架的使用, 将它们序列化为Bond对象,然后反序列化.

要构建和运行演示,您不需要安装除Visual Studio之外的任何软件.

使用微软债券

获得债券

检查 找到邦德的官方指南 适用于您的平台.

为 .. NET项目,这就像:

    安装包的债券.CSharp

套餐包括:

  • 代码生成器(gbc.Exe)在bin文件夹
  • .网库
  • MSBuild任务

工作流

工作流程包括以下步骤:

  • 学习DSL,定义数据模式.债券”文件(年代).
  • 使用代码生成器(" gbc.exe”)获取编程语言的dto.
  • 在您的项目中引用生成的文件以及Bond运行时库.

考虑使用框架提供的MSBuild任务来自动化代码生成步骤.

DSL特性概述

当你开始写你的第一本".文件,您将需要知道它的语法和特性. 请浏览 官方文档页面 详细描述IDL. 让我们回顾一下基本特征:

  • 模块:schema可以被分割成不同的文件,这些文件包含在" import "语句中.
  • 命名空间:具有与c++ / c#相同的含义.
  • 用户自定义结构:用户类型定义的单位.
  • 前向声明对于递归数据结构很有用.
  • 基本类型:bool, uint8(到64),int8(到64),float, double, string, wstring.
  • 容器类型:blob、列表、矢量,设置、地图, nullable”.
  • 自定义类型别名和映射,例如.g. 如果你想在c#中有“DateTime”,但在线上打勾(“int64”).
  • 自定义属性:用于自定义代码生成.

无聊? 下面是一个例子:

名称空间。
    
struct MyRecord
{
    0:字符串Name = " Name ";
    1: vector Constants;
}

其中“0”和“1”是字段序数(可以是任何整数与任何步调)和 =“无名” 是(可选的)默认值吗.

代码生成

Bond框架提供了用Haskell编写的代码生成工具. 下面是如何生成c#和c++代码。.在命令行中绑定模式:

GBC c#示例.债券
GBC c++示例.债券

支持的协议(格式)

开箱即用Bond支持三种协议:

  • 标记协议:“CompactBinary”和“FastBinary”

标记的协议在有效负载中穿插模式元数据. 这使得有效负载是自描述的, 允许消费者在不知道生产者使用的模式的情况下解释它.

  • 未标记协议:“SimpleBinary”

无标签协议只序列化数据, 因此要求消费者通过某种带外机制了解有效负载模式. 无标记协议通常用于存储场景,因为它们允许存储一次模式(例如.g. (在数据库中的系统表中), 从而消除了使用相同模式的许多记录的元数据开销.

  • 基于dom的协议:“SimpleJson”和“SimpleXml”

基于dom的协议将整个有效负载解析为内存中的数据对象模型,然后在反序列化期间查询该模型. 通常,这种协议用于实现基于文本的编码,如JSON或XML.

对于每个协议, Bond运行时库为您提供相应的Reader和Writer类, 哪一个在实际序列化中完成工作.

使用这些协议非常简单,比著名的“JsonConvert”稍微困难一些.序列化Object()”:

var record =新建MyRecord
{
    Name = "FooBar",
    常数= {3.14, 6.28 }
};

var output = new OutputBuffer();
var writer = new CompactBinaryWriter(output);
序列化.(作家、记录);

var input = new InputBuffer(输出.数据);
var reader = new CompactBinaryReader(input);
record = Deserialize.从(读者);

接下来是什么?

如果你喜欢邦德, 如果你有足够的空闲时间来编程, 考虑将其中一个项目纳入开发. 我不会列举你从贡献中可能得到的所有好处, 但我知道许多开发者都在寻找自己的想法:

  • 实现到Java的端口. 用您选择的其他主流语言替换Java.
  • 实现Bond模式导入/导出,以便与其他dsl进行交换.g. “.proto <=> .债券”).

无论你决定对邦德做什么,我建议你联系我 亚当Sapek 第一个. 他是这个项目的负责人,他会根据市场的需求来指导你.

聘请Toptal这方面的专家.
现在雇佣
安德烈斯米尔诺夫

安德烈斯米尔诺夫

验证专家 在工程

安卡拉,土耳其

2014年12月11日成为会员

作者简介

Andrei在微软这样的公司工作了15年以上, EMC, 摩托罗拉, 以及德意志银行(Deutsche Bank)的手机业务, 桌面, 和web使用c++, C#, 和JS.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

以前在

微软

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

世界级的文章,每周发一次.

输入您的电子邮件,即表示您同意我们的 隐私政策.

Toptal开发者

加入总冠军® 社区.