序列化格式:XML、JSON、YAML

本文详细介绍了.NET中常见的序列化格式,包括二进制、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
--- <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>---
不同的YAML解析器可能扩展出一些不同的特性,下面是YAML基本语法的简单说明:
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 }  #使用自定义数据类型
4. 文本块
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 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的一个对象)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值