.NET中序列化通常使用二进制或xml格式,ajax兴起之后JSON格式也用的比较多,相比YAML就很少见
二进制
无法直接阅读,需在二进制层面编码解码;
格式由厂商定义,特定应用需要表示的对象很复杂时,格式也非常复杂,例如office 文件格式;
通常需要充分考虑协议的扩展性、兼容性,例如windows的文件格式,DOS header、COFF header、PE、CLR header等;
相对于文本形式,体积小,编码、解码可以更高效;
XML
文本协议,可以阅读;
严格的格式要求;
运用广泛,相关技术比较丰富,例如DTD、 XPath、XLink、XPoint、XSLT等;
JSON
文本协议,易于阅读;
相比于XML,语法更简单,体积更小,有javascript语言的标准支持。缺少引用概念(XLink、XPoint),缺少路径概念(XPath);
XML用于更通用的目的,JSON更适合于数据交互的环境(尤其是web环境);
JSON基于 javascript语言 ECMA 262 3rd Edition,现在趋向于成为一种跨语言的数据交互格式
完整的格式最初由 RFC4627定义,直观的 syntax diagram以及各语言的支持类库参考 json.org
JSONP
JSONP只是在JSON的基础上加了一点东西,以便于站点之间实现JSON数据的交互
比如url:http://domain1.com/getjson将返回一个JSON对象{"Name":"Cheeso","Rank":7},使用JSONP可以如下进行引用:
<script type='text/javascript' src='http://domain1.com/getjson?jsonp=parseResponse'></script>
返回的数据parseResponse({"Name":"Cheeso","Rank":7})
YAML
文本协议,易于阅读;
YAML的语法比JSON复杂,JSON可以看作YAML的一个子集。也正因为语法规范较复杂,不同的YAML库对某些特征的处理也可能不一样
完整的YAML规范以及各语言支持类库参考 yaml.org
简单语法元素说明可以参考 YAML RefCard
YAML解析器语法树参考 YAML Reference Parser,可以直接输入YAML文本,或者上传一个YAML文件,点preview可以查看到参考解析器解析后的语法树结构以及每个节点与YAML之间的对应关系
YAML文档示例:
不同的YAML解析器可能扩展出一些不同的特性,下面是YAML基本语法的简单说明:
1. 注释以#符号开始,到行的结束位置
2. 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
3. 可以显示指定数据类型,还可以使用YAML解析器支持的用户自定义数据类型
4. 文本块
a). newline preserved。以一个竖线作为标记
默认情况下每行开始和结束位置上的空白符会被去掉,每行结束位置的换行符将保留
上面示例转换成html应当类似如下:b). newline folded。以右尖括号作为标记
默认情况下每行开始和结束位置上的空白符会被去掉,每行结束位置的换行符被替换为一个空格,空白行将当作一个段落区分标记
上面示例转换成html应当类似如下:
5. Hash
a). 使用key: value方式,每行给出一个值
b). 类似JSON对象的表示方式
a). 用中划线+空格,每行给出一个列表元素
b). 类似JSON数组的表示方式
8. 多个YAML文档可以放在一个文件中,使用---分隔开(一个YAML文档可理解为类似JSON的一个对象)
二进制
无法直接阅读,需在二进制层面编码解码;
格式由厂商定义,特定应用需要表示的对象很复杂时,格式也非常复杂,例如office 文件格式;
通常需要充分考虑协议的扩展性、兼容性,例如windows的文件格式,DOS header、COFF header、PE、CLR header等;
相对于文本形式,体积小,编码、解码可以更高效;
XML
文本协议,可以阅读;
严格的格式要求;
运用广泛,相关技术比较丰富,例如DTD、 XPath、XLink、XPoint、XSLT等;
JSON
文本协议,易于阅读;
相比于XML,语法更简单,体积更小,有javascript语言的标准支持。缺少引用概念(XLink、XPoint),缺少路径概念(XPath);
XML用于更通用的目的,JSON更适合于数据交互的环境(尤其是web环境);
JSON基于 javascript语言 ECMA 262 3rd Edition,现在趋向于成为一种跨语言的数据交互格式
完整的格式最初由 RFC4627定义,直观的 syntax diagram以及各语言的支持类库参考 json.org
JSONP
JSONP只是在JSON的基础上加了一点东西,以便于站点之间实现JSON数据的交互
比如url:http://domain1.com/getjson将返回一个JSON对象{"Name":"Cheeso","Rank":7},使用JSONP可以如下进行引用:
<script type='text/javascript' src='http://domain1.com/getjson?jsonp=parseResponse'></script>
返回的数据parseResponse({"Name":"Cheeso","Rank":7})
YAML
文本协议,易于阅读;
YAML的语法比JSON复杂,JSON可以看作YAML的一个子集。也正因为语法规范较复杂,不同的YAML库对某些特征的处理也可能不一样
完整的YAML规范以及各语言支持类库参考 yaml.org
简单语法元素说明可以参考 YAML RefCard
YAML解析器语法树参考 YAML Reference Parser,可以直接输入YAML文本,或者上传一个YAML文件,点preview可以查看到参考解析器解析后的语法树结构以及每个节点与YAML之间的对应关系
YAML文档示例:
|
1
|
---
<br>receipt
:
Oz-Ware Purchase Invoice<br>date
:
2007-08-06<br>customer
:
<br> given
:
Dorothy<br> family
:
Gale<br>items
:
<br> - part_no
:
A4786<br> descrip
:
Water Bucket (Filled)<br> price
:
1.47<br> quantity
:
4<br> - part_no
:
E1628<br> descrip
:
High Heeled
"Ruby"
Slippers<br> price
:
100.27<br> quantity
:
1<br>bill-to
:
&id001<br> street
:
|<br> 123 Tornado Alley<br> Suite 16<br> city
:
East Westville<br> state
:
KS<br>ship-to
:
*id001<br>specialDelivery
:
><br> Follow the Yellow Brick<br> Road to the Emerald City.<br> Pay no attention to the<br> man behind the curtain.<br>---
|
1. 注释以#符号开始,到行的结束位置
2. 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
3. 可以显示指定数据类型,还可以使用YAML解析器支持的用户自定义数据类型
|
1
|
---
<br>a
:
123
# 整数类型<br>b: "123" # 字符串类型,使用双引号括起来<br>c: 123.0 # 浮点类型<br>d: !!float 123 # 显示指定为浮点类型<br>e: !!str 123 # 显示指定为字符串类型<br>f: !!str Yes # 显示指定为字符串类型<br>g: Yes # a boolean True<br>h: Yes we have No bananas # 字符串,其中的Yes、No作为字符串的一部分<br># 二进制类型<br>picture: !!binary |<br> R0lGODlhDAAMAIQAAP//9/X<br> 17unp5WZmZgAAAOfn515eXv<br> Pz7Y6OjuDg4J+fn5OTk6enp<br> 56enmleECcgggoBADs=mZmE<br>myObject: !myClass { name: Joe, age: 15 } #使用自定义数据类型
|
a). newline preserved。以一个竖线作为标记
|
1
|
---
|<br> There once was a man from Darjeeling<br> Who got
on
a bus bound for Ealing<br> It said
on
the door<br>
"Please don't spit on the floor"
<br> So he carefully spat
on
the ceiling
|
上面示例转换成html应当类似如下:b). newline folded。以右尖括号作为标记
|
1
|
---
><br> Wrapped text<br> will be folded<br> into a single<br> paragraph<br> Blank lines denote<br> paragraph breaks
|
上面示例转换成html应当类似如下:
Wrapped text will be folded into a single paragraph
Blank lines denote paragraph breaks
转换成编程语言的字符串,应当类似如下:
"Wrapped text will be folded into a single paragraph\nBlank lines denote paragraph breaks" 在|或者>后面可以使用+、-符号控制换行、段落的行为
5. Hash
a). 使用key: value方式,每行给出一个值
b). 类似JSON对象的表示方式
--- # Indented Blocks, common in YAML data files, use indentation and new lines to separate the key: value pairs
name: John Smith
age: 33
--- # Inline Blocks, common in Yaml data streams, use commas to separate the key: value pairs between braces
{name: John Smith, age: 33} 6. List
a). 用中划线+空格,每行给出一个列表元素
b). 类似JSON数组的表示方式
--- # Favorite movies - Casablanca - North by Northwest - The Man Who Wasn't There --- # Shopping list [milk, pumpkin pie, eggs, juice]lists of hashes
- {name: John Smith, age: 33}
- name: Mary Smith
age: 27 hashes of lists
men: [John Smith, Bill Jones] women: - Mary Smith - Susan Williams7. 数据引用、合并可以使用&符号定义一个引用标签,使用符号*引用这个标签的数据,使用符号<<进行hash值合并操作,例如:
# sequencer protocols for Laser eye surgery
---
- step: &id001 # defines anchor label &id001
instrument: Lasik 2000
pulseEnergy: 5.4
pulseDuration: 12
repetition: 1000
spotSize: 1mm
- step:
<<: *id001 # merges key:value pairs defined in step1 anchor
spotSize: 2mm # overrides "spotSize" key's value
- step:
<<: *id001 # merges key:value pairs defined in step1 anchor
pulseEnergy: 500.0 # overrides key
alert: > # adds additional key
warn patient of
audible pop &id001定义了一个id001的引用标签(引用文档中第一个step元素的所有属性);第二个step元素引用id001后,重写spotSize属性;第三个step元素引用id001后,重写pulseEnergy属性,并添加alert属性
8. 多个YAML文档可以放在一个文件中,使用---分隔开(一个YAML文档可理解为类似JSON的一个对象)
本文详细介绍了.NET中常见的序列化格式,包括二进制、XML、JSON及YAML的特点与应用场景,对比了它们之间的优缺点。

被折叠的 条评论
为什么被折叠?



