netty的java序列化使用
.addLast(newObjectEncoder())
.addLast(newObjectDecoder(ClassResolvers.weakCachingResolver(this.getClass().getClassLoader())))
ObjectDecoder继承了LengthFieldBasedFrameDecoder
首先看LengthFieldBasedFrameDecoder的构造函数
publicLengthFieldBasedFrameDecoder(
ByteOrder byteOrder, intmaxFrameLength, intlengthFieldOffset, intlengthFieldLength,intlengthAdjustment, intinitialBytesToStrip, booleanfailFast) {
maxFrameLength:解码的帧的最大长度
lengthFieldOffset :长度属性的起始位(偏移位)
lengthFieldLength:长度属性的长度
lengthAdjustmen:长度调节值,在总长被定义为包含包头长度时,修正信息长度。
initialBytesToStrip:跳过的字节数,根据需要我们跳过lengthFieldLength个字节,以便接收端直接接受到不含“长度属性”的内容
failFast :为true,当frame长度超过maxFrameLength时立即报TooLongFrameException异常,为false,读取完整个帧再报异常
ObjectDecoder默认设置的参数为
maxFrameLength:1048576
lengthFieldOffset :0
lengthFieldLength:4
lengthAdjustmen:0
initialBytesToStrip:4
说明去掉前面的4个字节
通过父类LengthFieldBasedFrameDecoder解码后,在由CompactObjectInputStream完成反序列化,CompactObjectInputStream继承了ObjectInputStream,
实际上就是通过java的基础类来完成序列化和反序列化,此外还通过覆盖一些方法来完成缓存的功能。
至于覆盖的3个方法的具体作用,需要接下来读一下ObjectInputStream的源码。