序列化-3-自定义序列化协议
文章目录
1、协议实现方式说明
- 序列化
- 使用netty3中的ChannelBuffers类提供的
dynamicBuffer()
方法创建动态长度可变的ChannelBuffer,用于存储序列化后的字节数组 - 对于基本类型(byte、short、int、long、double、float、double),使用ChannelBuffer的writeXxx方法写入
- 对于String类型数据,采用
short+Byte[]
的格式写入,其中short表示String转成byte数组后数组的长度 - 对于List类型数据,采用
short+Object+Object...
格式写入,其中short表示list中元素的个数,Object为List中的元素 - 对于Map类型数据,采用
short+KeyObject+ValueObject+KeyObject+ValueObject...
格式写入,其中short表示map中元素的个数 - 对于其他类型数据,需继承一个基类,继承该基类的类需提供写入方法的具体实现
- 使用netty3中的ChannelBuffers类提供的
- 反序列化
- 使用netty3中的ChannelBuffers类提供的
copiedBuffer(byte[] array)
方法创建ChannelBuffer对象,通过该ChannelBuffer对象来读取属性值 - 对于基本类型(byte、short、int、long、double、float、double),使用ChannelBuffer的readXxx方法读取
- 对于String类型数据,先读取short即字符串字节数组长度size,再通过size读取字符串
- 对于List类型的数据,先读取short即List中元素个数,再循环读取信息加入到List中
- 对于Map类型的数据,先读取short即Map中元素个数,再循环读取key值和value值加入到Map中
- 对于其他数据类型,需继承一个基类,继承该基类的类需提供读取方法的具体实现
- 使用netty3中的ChannelBuffers类提供的
2、具体实现
1 | package io.github.lin38.serialize.demo007; |
1 | package io.github.lin38.serialize.demo007; |
1 | package io.github.lin38.serialize.demo007; |
1 | package io.github.lin38.serialize.demo007; |
执行结果:
1 | [0, 0, 0, 0, 0, 0, 1, 64, 0, 0, 0, 20, 0, 5, 112, 101, 116, 101, 114, 0, 1, 0, 0, 3, -23] |