Themis 序列化协议说明 V1.1
github地址[https://github.com/icesun963/NetThemis]
协议特点:
无需预定义的二进制格式,可添加任意Key/Value 类Json风格,又可使用固定结构来进一步压缩交换空间和编码效率。
二进制协议为Zigzag,大大缩小所占用空间,完全兼容Json协议,开发期Json带来可读性和解析便利性,后续可通过预定义描述,
对传输体积进行压缩,并且提供ToJson接口,在客户端最低成本接入新协议,序列化协议接近Json,体积为Json 30%,更低的CPU开销。
通过定制的代码,可以接近Protobuf的性能和体积,并且拥有Json的灵活性。
格式说明:
数据块描述:
如果是类Json字段: Head < 100
(int)Head|(string)字段名|(int)类型区块|数据区块
预定区块 : Head > 100,通过预定节点,自带描述,Name,Type组合,
(int)Head|数据区块
数据区块,如果是可变长,类似String,Byte[],会预先写入长度,然后写入数据段。
由上可看出,如果基于双方约定,则可以通过预定区块,达到数据最优化,如果没有预定义,则类Json字段依然可以保持数据的兼容性。
可通过管理预定义来进行版本升级和兼容。
预定保留字段:
头区块描述
0-10 为保留类型(用于描述结构)
NULL = 0
Doc = 1 文档类型
Array = 2 数组类型
ArrayT = 3 数组类型,但是绑定类型(后面跟类型)
ArrayEnd =4 数组结尾(为了无长度描述,用于关闭描述)
Bson = 5 类Bson数据描述
LvStart = 6 表示这是下一个文档 对应{
LvEnd = 7 表示层级结束 对应 }
//以下为扩展,如果需要局部序列化或修改 * 长度 包含长度自身,可以认为长度=区块内数据+4
Array2 = 12 数组类型,但是后面带4位长度
Array2|长度|.........|ArrayEnd
ArrayT2 = 13 数组类型,但是绑定类型,但是后面带4位长度 ArrayT2|类型|长度|.........|ArrayEnd
LvStart2 =16 同LvStart6, 但是后面带长度
LvStart2|长度|..........|LvEnd
50-100为数据类型(int string byte 等。。)
100-???为预定义类型区块,用于加速描述
LVStart,Array,ArrayT后有保留4位,用于描述当前长度。(用于搜索友好)
根节点无需LvStart|LvEnd描述,也不包含长度字段
示例Json数据:
{ "Name" : "123456" , "Value" : null }
对应格式:
/05/04/Name/63/06/123456/05/05/Value/00
/05
-Bson 头
/04/Name
-字段名 长度4
/63
-类型 String
/06/123456
-数据 123456 长度4
/05
-Bson 头
/05/Value
-字段名 长度5
/00
-空数据
嵌套数据示例:
{ "Name" : "123456" , "Value" : { "Key" : "Value" } }
/05/04/Name/63/06/123456/05/05/Value/01/06/05/03/Key/63/05/Value/07
/05
-Bson 头
/04/Name
-字段名 长度4
/63
-类型 String
/06/123456
-数据 123456 长度4
/05
-Bson 头
/05/Value
/01
-Doc
/06
-{ 层开头
/05/03/Key/63/05/Value
/07
- }层结束
数组示例:
[ 1,2,3,4 ]
/02
-数组开头
/58/1
-类型,数据
/58/2
/58/3
/58/4
/04
-数组结束
或者采用
/03/58
-数组开头,跟类型
/1
/2
/3
/4
/04
-数组结束
如果我们有预定类型 (仅为了缩短字段描述)
Name,String 101
Value,String 102
示例Json数据:
{ "Name" : "123456" , "Value" : null }
对应格式:
/101/06/123456/102/00
/101
-101对应 Name,String
/06/123456
-数据
/102
-101对应 Value,String
/00
-数据