Richie

Sometimes at night when I look up at the stars, and see the whole sky just laid out there, don't you think I ain't remembering it all. I still got dreams like anybody else, and ever so often, I am thinking about how things might of been. And then, all of a sudden, I'm forty, fifty, sixty years old, you know?

序列化格式: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文档示例:
---
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.
---
不同的YAML解析器可能扩展出一些不同的特性,下面是YAML基本语法的简单说明:
1. 注释以#符号开始,到行的结束位置

2. 简单数据(scalars,标量数据)可以不使用引号括起来,包括字符串数据。用单引号或者双引号括起来的被当作字符串数据,在单引号或双引号中使用C风格的转义字符

3. 可以显示指定数据类型,还可以使用YAML解析器支持的用户自定义数据类型
---
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 } #使用自定义数据类型
4. 文本块
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 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 Williams
7. 数据引用、合并 可以使用&符号定义一个引用标签,使用符号*引用这个标签的数据,使用符号<<进行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的一个对象)

posted on 2010-03-01 14:30  riccc  阅读(8351)  评论(1编辑  收藏  举报

导航