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

}
相关推荐
橘子131 小时前
Linux网络基础(一)
linux·网络·arm开发
闲人编程2 小时前
Python在网络安全中的应用:编写一个简单的端口扫描器
网络·python·web安全·硬件·端口·codecapsule·扫描器
机器学习之心6 小时前
基于双向时序卷积网络(BiTCN)与支持向量机(SVM)混合模型的时间序列预测代码Matlab源码
网络·支持向量机·matlab
止水编程 water_proof8 小时前
Java-HTTP响应以及HTTPS(下)
网络·网络协议·http
好望角雾眠8 小时前
第四阶段C#通讯开发-9:网络协议Modbus下的TCP与UDP
网络·笔记·网络协议·tcp/ip·c#·modbus
网安小白的进阶之路8 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-5
网络·安全·web安全
8K超高清8 小时前
高校巡展:中国传媒大学+河北传媒学院
大数据·运维·网络·人工智能·传媒
C2H5OH6669 小时前
WebSocket-练习1
网络·websocket·网络协议
狂奔的sherry9 小时前
Socket vs WebSocket
网络·websocket·网络协议
sadandbad10 小时前
[vulhub靶机通关]DC-2(rbash绕过_git提权)
网络·sql·web安全·网络安全