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?