netty系列文章:
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{
@Override
public <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];
}
@Override
public <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;
}
@Override
public 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{
@Override
public <T> byte[] serialize(T obj) {
return JSON.toJSONString(obj).getBytes();
}
@Override
public <T> T deserialize(byte[] data, Class<T> clazz) {
return JSON.parseObject(new String(data),clazz);
}
@Override
public 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);
}
}