Hessian2Serialization
id 2
content-type x-application/hessian2
包装了两个out和input对象给out和in的channel使用
Hessian2ObjectOutput,大部分write方法会边界检测,如果offset+16大于SIZE(4096)就会flush
writeBoolean
true T表示 1字节
false F表示 1字节
writeByte,writeShort,writeInt内部都是同一个方法
如果大于-0x10并小于0x2f 就使用0x9 x 1字节
大于-0x80并小于0x7ff就0xc8 xx xxxx 结构 2字节
-0x40000 与0x3ffff 0xd4 xx xxxx xxxx 3字节
最后使用I表示int,后面四位数据 一共5字节
byte[]
空的情况用N
不是空的,会进行切片
SIZE-offset-3 < length
A 表示chunk 1字节
下面两个字节 chunk长度 0x0XXX 2字节
body 数据
最后拼接整个数组长度规则和上面类似,不过没有int长度,三个长度的时候首位用B表示
UTF UTF-8 String
空的时候返回N
有的时候类似数组,不过chunk用R表示内容是String
Object
查看SerializerFactory 里面的静态块,是一组序列化器
Object序列化的时候,会从静态map里获取序列化器
内部使用BasicSerializer
序列化java自带的类如包装类,数组等
没获取到,一般会获取最后的默认序列器javaSerializer
javaSerializer 构造的时候会解析class,并获取fields以及fields的序列化器数组
跳过_writeReplace过程
首先调用writeMapBegin会写入class type
然后写入具体type
check refMap,map没有就put k: class,v refInt(sizeOf(map)),开头为C,返回-1
第二次就直接写入refInt,返回refInt
ref如果是-1,就序列化定义
writeDefinition20
写入fields长度
迭代写入Feilds name
writeObjectBegin
写入refInt
如果ref 小于等于OBJECT_DIRECT_MAX 0x0f,0x6x
否则用一个O开头,然后写入ref
writeInstance写入obj
循环迭代序列化fields
Last updated
Was this helpful?