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

}
相关推荐
日更嵌入式的打工仔2 小时前
Ethercat COE 笔记
网络·笔记·ethercat
UVM_ERROR3 小时前
UVM实战:RDMA Host侧激励开发全流程问题排查与解决
服务器·网络·数据库
福尔摩斯张3 小时前
插件式架构:解耦与扩展的艺术与实践(超详细)
linux·服务器·网络·网络协议·tcp/ip
老王熬夜敲代码4 小时前
网路编程--协议
linux·网络·笔记
北邮刘老师4 小时前
智能体,超越人类与机器的世界“理解者”
网络·人工智能·大模型·智能体·智能体互联网
A13247053124 小时前
SSH远程连接入门:安全高效地管理服务器
linux·运维·服务器·网络·chrome·github
yenggd5 小时前
企业总部-分支-门点-数据中心使用骨干网SRv6 BE互联互通整体架构配置案例
运维·网络·计算机网络·华为·架构
FserSuN5 小时前
TCP RST 与 Broken Pipe:从协议语义到操作系统信号的体系化梳理
网络·网络协议·tcp/ip
fiveym5 小时前
PXE启动菜单配置完全指南:打造高效网络装机入口
开发语言·网络·php
青山如墨雨如画5 小时前
【北邮-研-图论】网络最大流的标号算法V1.0
网络·算法·图论·北邮