在 comproto 有 4 种handler
(对对象进行自定义处理,转化为可以被存储的值)
-
ClassHandler
通过
setHandlerMarker
方法给类的prototype
属性添加mark
,这样的话此类的实例都可以被序列化 -
CustomHandler
通过
setHandlerMarker
方法给对象属性添加mark
,然后通过addCustomHandler
方法添加序列化handler
-
Handler
通过
addHandler
给添加序列化方法,有个canHandler
方法可以判断对象是否可以被序列化(会添加到列表然后每次序列化时循环判断,会比较费性能,谨慎使用) -
TypeHandler(将对象转化成 Uint8Array)
只在内部进行处理,不对外
当对象不可被用户添加的自定义
handler
处理,就会默认走这个 Handler,首先它会通过Object.prototy.toString
来判断对象类型,然后导航到对应的 TypeHandler
tag 是用来确定数据类型的,有时候当数据量小的时候,也可以充当判断 dataBuffer 的依据
Uint8Array 结构大体都是tag + [lenBuffer] + dataBuffer
这种结构
先将 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 只有一个字节,所以长度只有 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) |