序列化格式:XML、JSON、YAML
.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文档示例:
1. 注释以#符号开始,到行的结束位置
2. 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
3. 可以显示指定数据类型,还可以使用YAML解析器支持的用户自定义数据类型
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文档示例:
---不同的YAML解析器可能扩展出一些不同的特性,下面是YAML基本语法的简单说明:
receipt: Oz-Ware Purchase Invoice
date: 2007-08-06
customer:
given: Dorothy
family: Gale
items:
- part_no: A4786
descrip: Water Bucket (Filled)
price: 1.47
quantity: 4
- part_no: E1628
descrip: High Heeled "Ruby" Slippers
price: 100.27
quantity: 1
bill-to: &id001
street: |
123 Tornado Alley
Suite 16
city: East Westville
state: KS
ship-to: *id001
specialDelivery: >
Follow the Yellow Brick
Road to the Emerald City.
Pay no attention to the
man behind the curtain.
---
1. 注释以#符号开始,到行的结束位置
2. 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符
3. 可以显示指定数据类型,还可以使用YAML解析器支持的用户自定义数据类型
---4. 文本块
a: 123 # 整数类型
b: "123" # 字符串类型,使用双引号括起来
c: 123.0 # 浮点类型
d: !!float 123 # 显示指定为浮点类型
e: !!str 123 # 显示指定为字符串类型
f: !!str Yes # 显示指定为字符串类型
g: Yes # a boolean True
h: Yes we have No bananas # 字符串,其中的Yes、No作为字符串的一部分
# 二进制类型
picture: !!binary |
R0lGODlhDAAMAIQAAP//9/X
17unp5WZmZgAAAOfn515eXv
Pz7Y6OjuDg4J+fn5OTk6enp
56enmleECcgggoBADs=mZmE
myObject: !myClass { name: Joe, age: 15 } #使用自定义数据类型
a). newline preserved。以一个竖线作为标记
--- |默认情况下每行开始和结束位置上的空白符会被去掉,每行结束位置的换行符将保留
There once was a man from Darjeeling
Who got on a bus bound for Ealing
It said on the door
"Please don't spit on the floor"
So he carefully spat on the ceiling
上面示例转换成html应当类似如下: b). newline folded。以右尖括号作为标记
--- >默认情况下每行开始和结束位置上的空白符会被去掉,每行结束位置的换行符被替换为一个空格,空白行将当作一个段落区分标记
Wrapped text
will be folded
into a single
paragraph
Blank lines denote
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 pairs6. List
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}
a). 用中划线+空格,每行给出一个列表元素
b). 类似JSON数组的表示方式
--- # Favorite movieslists of hashes
- Casablanca
- North by Northwest
- The Man Who Wasn't There
--- # Shopping list
[milk, pumpkin pie, eggs, juice]
- {name: John Smith, age: 33}hashes of lists
- name: Mary Smith
age: 27
men: [John Smith, Bill Jones]7. 数据引用、合并 可以使用&符号定义一个引用标签,使用符号*引用这个标签的数据,使用符号<<进行hash值合并操作,例如:
women:
- Mary Smith
- Susan Williams
# sequencer protocols for Laser eye surgery&id001定义了一个id001的引用标签(引用文档中第一个step元素的所有属性);第二个step元素引用id001后,重写spotSize属性;第三个step元素引用id001后,重写pulseEnergy属性,并添加alert属性
---
- 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
8. 多个YAML文档可以放在一个文件中,使用---分隔开(一个YAML文档可理解为类似JSON的一个对象)