序列化格式:XML、JSON、YAML

主宰稳场 提交于 2020-01-19 13:34:33
.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 Invoicedate:        2007-08-06customer:    given:   Dorothy    family:  Galeitems:    - part_no:   A4786      descrip:   Water Bucket (Filled)      price:     1.47      quantity:  4    - part_no:   E1628      descrip:   High Heeled "Ruby" Slippers      price:     100.27      quantity:  1bill-to:  &id001    street: |            123 Tornado Alley            Suite 16    city:   East Westville    state:  KSship-to:  *id001specialDelivery:  >    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 Trueh: Yes we have No bananas   # 字符串,其中的Yes、No作为字符串的一部分# 二进制类型picture: !!binary | R0lGODlhDAAMAIQAAP//9/X 17unp5WZmZgAAAOfn515eXv Pz7Y6OjuDg4J+fn5OTk6enp 56enmleECcgggoBADs=mZmEmyObject:  !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的一个对象)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!