Skip to content

Latest commit

 

History

History
87 lines (63 loc) · 3.58 KB

实现过程.md

File metadata and controls

87 lines (63 loc) · 3.58 KB

Comproto 解析

流程分析

在 comproto 有 4 种handler(对对象进行自定义处理,转化为可以被存储的值)

  • ClassHandler

    通过setHandlerMarker方法给类的 prototype 属性添加 mark,这样的话此类的实例都可以被序列化

  • CustomHandler

    通过setHandlerMarker方法给对象属性添加mark,然后通过addCustomHandler方法添加序列化handler

  • Handler

    通过addHandler给添加序列化方法,有个canHandler方法可以判断对象是否可以被序列化(会添加到列表然后每次序列化时循环判断,会比较费性能,谨慎使用)

  • TypeHandler(将对象转化成 Uint8Array)

    只在内部进行处理,不对外

    当对象不可被用户添加的自定义handler处理,就会默认走这个 Handler,首先它会通过Object.prototy.toString来判断对象类型,然后导航到对应的 TypeHandler

TypeHandler

tag 是用来确定数据类型的,有时候当数据量小的时候,也可以充当判断 dataBuffer 的依据

Uint8Array 结构大体都是tag + [lenBuffer] + dataBuffer这种结构

举个例子:(其他的类型也是按照这种模式进行存储)

String

先将 string 转化为 u8a,判断 buffer 长度来确定 tag

大于 0 小于 32 时使用0xa0 ~ 0xbf作为 tag,后直接跟dataBuffer

大于 32 小于 255(0xFF)时使用0xd9作为 tag, tag 后一位字节存长度,再跟dataBuffer

大于 255 小于 65535(0xFFFF)时使用0xda作为 tag,tag 后两位字节存长度,再跟dataBuffer

大于 65535(0xFFFF)时使用0xdb作为 tag,tag 后三位字节存长度,再跟dataBuffer

tag 表

因为 tag 只有一个字节,所以长度只有 255。

mean tag
positive fixint 0x00 ~ 0x7f (0 ~ 127)
fix object 0x80 ~ 0x8f
fix array 0x90 ~ 0x9f
fix str 0xa0 ~ 0xbf
null 0xc0
undefined 0xc1
false 0xc2
true 0xc3
ArrayBufferView 0xc4
ArrayBufferView 0xc5
ArrayBufferView 0xc6
ext 0xc7
map 8-- 0xc8
map 1 6-- 0xc9
map 32 0xca
float 64 0xcb
positive varint 0xcc
negative varint 0xcd
(unuse) 0xce
(unuse) 0xcf
(unuse) 0xd0
(unuse) 0xd1
(unuse) 0xd2
(unuse) 0xd3
bigInt 0xd4
(unuse) 0xd5
(unuse) 0xd6
(unuse) 0xd7
(unuse) 0xd8
str 8 0xd9
str 16 0xda
str 32 0xdb
one empty in array 0xdc
many empty in array 0xdd
(unuse) 0xde
(unuse) 0xdf
negative fixint 0xe0 ~ 0xff (-32 ~ -1)