Themis 序列化协议说明 V1.1[开源]

来源:互联网 发布:windows 10 磁盘加密 编辑:程序博客网 时间:2024/06/07 04:42

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 -数据







0 0