Java标准的序列化

发表时间:2017-10-27 09:35:35 浏览量( 30 ) 留言数( 0 )

学习目标:

1、了解LengthFieldBasedFrameDecoder

2、了解Netty的编解码


学习过程:

一、

一、编码发送一个对象时我们需要这样做:

1、把对象序列化,Java对象的序列化应该对我们来说没有什么问题。我们可以自己实现一个编码器,也可以使用Netty提供的专门的针对对象序列化的编码器ObjectEncoder。

2、计算序列化后的长度,然后在字节码的前面添加长度标识,我们可以使用上一节课介绍的LengthFieldPrepender。


二、接收一个对象时

1、根据长度表示接收对象序列化后的字节码,以解决TCP的问题,就是使用LengthFieldBasedFrameDecoder。

2、使用对象反序列化,把对象解析出来,这里可以自定一个解码器,也可以使用Netty内置的ObjectDecoder

3、然后就可以自定义Handler对获得的对象进行业务处理了。


很多时候我们一个服务端(客户端)既发送对象,也会接收对象,所以这些编解码器都会一起使用,只要大家了解了每一个编解码器的作用,就不会感觉到乱的了。好下面我们直接上代码吧


channel.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4));

channel.pipeline().addLast(new LengthFieldPrepender(4));

channel.pipeline().addLast(new ObjectEncoder());

/*

         * 使用 weakCachingConcurrentResolver 创建线程安全的 WeakReferenceMap

         * ,对类加载器进行缓存

         * ,它支持多线程并发访问,当虚拟机内存不足时,会释放缓存中的内存,防止内存泄露,为了房子异常码流和解码错位导致的内存溢出

         * ,这里将当个对象序列化之后的字节数组长度设置为Integer.MAX_VALUE

         */

channel.pipeline().addLast(new ObjectDecoder(Integer.MAX_VALUE,

ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));

channel.pipeline().addLast(new ResponseChannelInboundHandlerAdapter());