?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);}}