当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/319066.html

相关文章:

  • 【MySQL基础篇】:MySQL事务并发控制原理-MVCC机制解析
  • qt的元对象系统详解
  • 2深度学习Pytorch-神经网络--全连接神经网络、数据准备(构建数据类Dataset、TensorDataset 和数据加载器DataLoader)
  • Activiti 中各种 startProcessInstance 接口之间的区别
  • [激光原理与应用-169]:测量仪器 - 皮秒激光器研发过程中所需要的测量仪器
  • 2025年机械工程与自动化技术国际会议(ICMEAT 2025)
  • 力扣 hot100 Day68
  • 主流小程序 SaaS 平台测评,2025年小程序开发避坑指南
  • 移动端录屏需求调研:以小熊录屏为例的轻量级实现方案
  • .NET9 AOT完全自举了吗?
  • 面向对象之类方法,成员变量和局部变量
  • 【前端八股文面试题】JavaScript中的数据类型?存储上的差别?
  • react_05create-react-app脚手架详细解析(export)
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的微商产品经营策略研究
  • 基于开源链动2+1模式AI智能名片S2B2C商城小程序的用户留存策略研究
  • iOS 文件管理实战指南,用户文件、安全访问与开发调试方案
  • Socket 编程预备
  • 拥抱云原生:从传统架构到云原生架构的演进与实践
  • 算法题(182):滑动窗口
  • mysql基础-分组查询
  • 全面解析 URL 重定向原理:从协议、实现到安全实践
  • 【物联网】基于树莓派的物联网开发【24】——树莓派安装influxDB时序数据库
  • 套接字编程UDP
  • Android-Kotlin基础(Jetpack③-LiveData)
  • 数据结构初阶(4)栈
  • Python生成统计学公式
  • 数据结构:双向链表(Doubly Linked List)
  • 快速搭建开源网页编辑器(vue+TinyMCE)
  • 大屏数据展示页面,数据可视化可以用到的框架和插件
  • 剧本杀小程序系统开发:推动社交娱乐产业创新发展