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 常见的序列化方式

  1. JSON:轻量级、跨语言、易读,适合大多数场景
  2. XML:较繁琐,但适合复杂结构和元数据描述
  3. 二进制格式:如 Python 的 pickle、Java 的 Serializable,效率高但通常不跨语言
  4. 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);
    }

}
相关推荐
wdfk_prog2 小时前
实战教程:从“对象文件为空“到仓库重生——修复 Git 仓库损坏全记录
大数据·网络·笔记·git·学习·elasticsearch·全文检索
朱以真139177649522 小时前
码头岸电系统如何保障供电安全?安科瑞绝缘监测及故障定位方案解析
网络·安全
Mr_wilson_liu3 小时前
网络拨测和业务拨测是什么意思
linux·网络
Doris_LMS5 小时前
一篇文章入门TCP与UDP(保姆级别)
网络·udp·tcp
摇光935 小时前
[复习]计算机网络
网络·计算机网络·国家电网
zx_zx_1235 小时前
套接字编程UDP
linux·网络·udp
chihongkeji_6 小时前
光纤滑环 – 光纤旋转接头(FORJ)- 杭州驰宏科技
网络·科技
wen__xvn6 小时前
计算机网络1-5:计算机网络的性能指标
网络·计算机网络
学习网安的doro6 小时前
3a服务器的基本功能1之身份认证
服务器·网络·学习·安全·身份认证·ac