aLoNe.Adams.K

独孤圣人的技术小站

虚表!高性能网络传输数据结构,替代Json的好帮手!

Json是什么

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。它基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

Json的语法规则

在 JS 语言中,一切都是对象。因此,任何支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。但是对象和数组是比较特殊且常用的两种类型:

  • 对象表示为键值对
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数据

Json的格式范例

{“firstName”: “John”}

Json格式的劣势

当使用Json承载数据表中的数据时候,会发现Json数组中的每个Json对象中都包含了重复的键名。在数据量多了的时候,重复出现的键名会导致每次网络交互中需要花费大量的流量在传递多余的键名上,会导致占用、消耗更多的网络资源,降低了网络的传输效率。

什么是虚表

虚表是高度简洁的数据模型,虚表由3部分构成:
1. 消息头
2. 字段头
3. 消息体

消息头

消息头是用于描述简单信息的,其由以下及部分组成
1. STATE 状态,0为正确,非0为错误
2. MESS 具体内容
3. ALLSIZE 当前返回数据完整的数据量,该属性一般用于返回数据集时,保存数据集完整数据数量
4. CURRENT 当前页码,该属性用于分页中描述当前第几页
5. PAGESIZE 分页数据量,该属性用于描述分页中每页的数据量

完整的消息头为,STATE#1MESS#1ALLSIZE#1CURRENT#1PAGESIZE

这里注意下,#1 代表的是asc字符中的数值为1的字符,在不同的语言中其表达形式不一样,Delphi中可以直接用#1,C#中可以用(char)1,java中也可以用(char)1表示。

字段头

字段头是用于描述虚表中保存的数据体所包含的字段定义的,其格式为:

COLTYPE:COLNAME

此为一个字段的定义,多个字段间用asc码中的数值为1的字符来进行间隔,也就是如下:

COLTYPE1:COLNAME1#1COLTYPE2:COLNAME2#1COLTYPE3:COLNAME3

关于字段的类型,定义为:1:整数 2:浮点 3:日期 4:时间 5:日期时间 6:字符串 7:布尔 8:多行文本 9:图像 10:大数据

消息体

消息体是保存数据集的部分,进行数据查询之后,将数据集中的每行数据进行解析,存放在消息体中,其一行数据的格式为:

ROWVALUE1#1ROWVALUE2#1ROWVALUE3

消息体中每行数据的下表,对应着字段头当中同样下标的字段内容。

虚表完整结构

虚表的消息头、字段头、消息体之间,通过#2来进行链接,即asc码中数值为2的字符。其格式如下:

消息头#2字段头#2消息体

虚表的优势

  1. 在大数据量传输过程中,每一行数据无需带有多余信息,只需要包含每个字段的值即可,降低了数据传输量。
  2. 结构简单,描述内容完善,虚表中包含字段的类型定义
  3. 使用方便,即可单独使用消息头部分,也可以完整使用。

虚表的劣势

  1. 非原生支持,每种语言下需要自己写相关的解析代码
  2. 没有了……

Json和虚表的性能对比

未完待续。。。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注