11-netty基础-手写rpc-支持多序列化协议-03
netty系列文章:
01-netty基础-socket |
02-netty基础-java四种IO模型 |
03-netty基础-多路复用select、poll、epoll |
04-netty基础-Reactor三种模型 |
05-netty基础-ByteBuf数据结构 |
06-netty基础-编码解码 |
07-netty基础-自定义编解码器 |
08-netty基础-自定义序列化和反序列化 |
09-netty基础-手写rpc-原理-01 |
10-netty基础-手写rpc-定义协议头-02 |
11-netty基础-手写rpc-支持多序列化协议-03 |
12-netty基础-手写rpc-编解码-04 |
13-netty基础-手写rpc-消费方生成代理-05 |
14-netty基础-手写rpc-提供方(服务端)-06 |
1 概念
- 序列化:将内存中的对象(如类实例、字典、列表等复杂数据结构)转换为可存储或可传输的格式(如字符串、字节流、JSON 等)的过程。
- 反序列化:将序列化后的格式(如字符串、字节流)恢复为内存中原始对象的过程
2 常见的序列化方式
- JSON:轻量级、跨语言、易读,适合大多数场景
- XML:较繁琐,但适合复杂结构和元数据描述
- 二进制格式:如 Python 的 pickle、Java 的 Serializable,效率高但通常不跨语言
- Protocol Buffers:Google 开发的高效二进制格式,跨语言支持好
因为序列化的方式多种多样,使用场景也不一样,所以要提供多种序列化的方式,然后根据业务场景来选择对应的序列化方式
3 实现代码
netty-protocol serializer包下
3.1 序列化接口ISerializer
package com.bonnie.protocol.serializer;public interface ISerializer {/** 序列化*/<T> byte[] serialize(T obj);/*** 反序列化* @param data* @param clazz* @param <T>* @return*/<T> T deserialize(byte[] data,Class<T> clazz);/*** 序列化的类型* @return*/byte getType();}
3.2 Java实现
package com.bonnie.protocol.serializer;import com.bonnie.protocol.enums.SerialTypeEnum;import java.io.*;public class JavaSerializer implements ISerializer{@Overridepublic <T> byte[] serialize(T obj) {ByteArrayOutputStream bos=new ByteArrayOutputStream();ObjectOutputStream oos= null;try {oos = new ObjectOutputStream(bos);oos.writeObject(obj); //序列化return bos.toByteArray();} catch (IOException e) {e.printStackTrace();}return new byte[0];}@Overridepublic <T> T deserialize(byte[] data, Class<T> clazz) {try {ObjectInputStream ois=new ObjectInputStream(new ByteArrayInputStream(data));return (T)ois.readObject();} catch (IOException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}@Overridepublic byte getType() {return SerialTypeEnum.JAVA_SERIAL.getCode();}}
3.2 Json实现
package com.bonnie.protocol.serializer;import com.alibaba.fastjson.JSON;
import com.bonnie.protocol.enums.SerialTypeEnum;public class JsonSerializer implements ISerializer{@Overridepublic <T> byte[] serialize(T obj) {return JSON.toJSONString(obj).getBytes();}@Overridepublic <T> T deserialize(byte[] data, Class<T> clazz) {return JSON.parseObject(new String(data),clazz);}@Overridepublic byte getType() {return SerialTypeEnum.JSON_SERIAL.getCode();}
}
3.3 管理ISerializer
根据不同的序列化类型返回对应的序列化处理类
package com.bonnie.protocol.serializer;import com.bonnie.protocol.enums.SerialTypeEnum;import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;/*** 序列化管理器*/
public class SerializerManager {private final static ConcurrentHashMap<Byte,ISerializer> serializer = new ConcurrentHashMap<>();static {JsonSerializer jsonSerializer = new JsonSerializer();JavaSerializer javaSerializer = new JavaSerializer();serializer.put(SerialTypeEnum.JAVA_SERIAL.getCode(), javaSerializer);serializer.put(SerialTypeEnum.JSON_SERIAL.getCode(), jsonSerializer);}public static ISerializer getSerializer(byte serializerCode) {ISerializer iSerializer = serializer.get(serializerCode);if (Objects.isNull(iSerializer)) {return new JavaSerializer();}return serializer.get(serializerCode);}}