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.pswp.cn/bicheng/92795.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92795.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92795.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

艾体宝产品 | 从“被看见”到“被信任”:GWI 协助洞察消费者,重构品牌认知

简介&#xff1a;本文介绍了基于消费者洞察构建品牌认知策略的核心方法。通过深度理解受众&#xff0c;GWI Spark 快速获取真实洞察&#xff0c;指导信息与渠道选择。GWI 帮助追踪情感与认知效果&#xff0c;避免无效曝光陷阱&#xff0c;最终帮助品牌实现从“被看见”到“被信…

Redis高级

目录 一、Redis主从 1. 主从集群结构 2. 主从同步原理 2.1 全量同步 2.2 增量同步 3. 主从同步优化 4. 总结 二、Redis哨兵 1. 哨兵工作原理 1.1 哨兵作用 1.2 状态监控 1.3 选举新的master节点 2. 总结 三、Redis分片集群 1. 散列插槽 2. 故障转移 四、Redis…

正点原子esp32s3探测土壤湿度

开发板使用&#xff1a;正点原子ATK_DNESP32S3 V1.3 IDE: VSCODE PLATFORMIO 土壤湿度检测传感器模块如下图&#xff1a; 引脚&#xff1a; 传感器VCC --> ESP32[3.3V] 传感器GND --> ESP32[GND] 传感器A0 --> ESP32[GPIO20] 代码如下&#xff1a; #include <…

一篇文章解决 Win10 同时部署多个版本的Tomcat

文章目录所用到的文件夹Tomcat服务端口修改Tomcat参数修改环境变量配置验证环境是否配置成功可能遇到的问题问题一&#xff1a;startup.bat闪退问题二&#xff1a;startup.bat成功启动&#xff0c;但仍打不开服务器总结最近在学习JavaWeb的时候&#xff0c;想安装新版本的Tomca…

CentOS7安装和使用Workbench

文章目录CentOS7安装和使用Workbench一、前言1.简介2.环境二、正文1.更换镜像源2.安装依赖包3.下载4.安装5.打开workbench6.使用记录1&#xff09;连接数据库2&#xff09;创建数据库3&#xff09;导入数据3&#xff09;导出数据4&#xff09;运行SQL脚本5&#xff09;打开SQL脚…

SpringBoot查询方式全解析

文章目录一、简介二、常用注解分类1、请求映射类&#xff08;处理 URL 与 HTTP 方法的绑定&#xff09;2、参数绑定类&#xff08;从请求中获取数据并绑定到方法参数&#xff09;3、控制器与增强类&#xff08;标识控制器及全局增强&#xff09;4、异常与响应处理类&#xff08…

Linux操作系统从入门到实战(十五)详细讲解Linux调试器 gdb/cgdb使用

Linux操作系统从入门到实战&#xff08;十五&#xff09;详细讲解Linux调试器 gdb/cgdb使用前言一、gdb/cgdb是什么&#xff1f;1. 程序的两种发布模式&#xff08;debug 和 release&#xff09;二、gdb/cgdb如何启动&#xff1f;1. 准备工作2. 启动 gdb/cgdb 调试器2.1 启动 g…

基于UDP的代理协议的Tuic怎么样?

Tuic&#xff08;全称“TUIClient”&#xff09;是一款基于UDP协议的轻量代理工具&#xff0c;主打低延迟与高实时性&#xff0c;专为解决传统TCP代理在实时场景中的性能瓶颈而生。其核心设计围绕“UDP优先”展开&#xff0c;通过简化握手流程、优化加密效率&#xff0c;在保持…

缓存投毒进阶 -- justctf 2025 Busy Traffic

题目核心逻辑如下 let browser; // 全局浏览器实例// 访问指定 URL 的异步函数 const visit async (url) > {try {// 如果已有浏览器实例&#xff0c;先关闭并等待 2 秒if (browser) {await browser.close();await sleep(2000);console.log("Terminated ongoing job.&…

复刻苏宁易购(移动端)

html代码<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><link rel"s…

Scrapy返回200但无数据?可能是Cookies或Session问题

引言 在使用Scrapy框架进行网页爬取时&#xff0c;开发者可能会遇到一个常见但令人困惑的问题&#xff1a;HTTP请求返回状态码200&#xff08;表示成功&#xff09;&#xff0c;但实际获取的数据却是空的。这种情况通常意味着目标服务器接受了请求&#xff0c;但由于某些原因没…

【gateway nc adapter虚拟网卡 win11 联想】问题的解决

前言&#xff1a;由于需要登录公司内网&#xff0c;于是启用奇安信VPN。但启动后报出网关未连接的问题&#xff0c;于是我检查了我的网络适配器&#xff0c;并尝试解决&#xff0c;以下给出几种我实践过程中的行动&#xff0c;并附带最后成功的解决方法 【gateway nc adapter虚…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的运营策略创新研究

摘要&#xff1a;在数字化商业生态快速演进的背景下&#xff0c;传统运营模式面临用户增长乏力、转化效率低下等挑战。本文以开源AI智能名片链动21模式与S2B2C商城小程序的深度融合为研究对象&#xff0c;提出通过周期化运营规划、关键节点策略设计、跨部门协同创新、数据驱动决…

smart-water表设计方案

-- -- 2. SOP 管理模块 -- -- 2.1 SOP主表 (存储SOP元数据&#xff0c;与版本分离) CREATE TABLE sops (id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),name VARCHAR(255) NOT NULL,description TEXT,latest_published_version_id UUID, -- 外键约束在版本表创建后添加crea…

A4.0:继C5.2的BJT理论引申的开关作用的应用示例

在C5里知道了BJT的静态工作点Q的计算方式&#xff08;IC和VCE的负载线&#xff09;&#xff0c;以及偏置电阻RB&#xff0c;得到了电流IB&#xff0c;进而通过电流增益hFE得到了IC(IC β*IB)&#xff0c;然后VCE VCC - IC*RC&#xff0c;即集电极和发射极之间的电压等于集电极…

平板探测器的主要技术指标

平板探测器(Flat-panel-detector,FPD)是一种广泛应用于医学影像学(如X射线、CT扫描等)、工业无损检测和科学研究中的成像设备。其主要技术指标包括以下几个方面: 1.空间分辨率(SpatialResolution) 定义:空间分辨率是指平板探测器能清晰分辨图像中细节的能力。一般以…

从苏州姑苏区人工智能大模型基础设施招标|学习参数5:单颗 AI 处理器的内存带宽如何达到 1600GB/s

招标参数5:配置≥8 个AI 处理器,支持OAM式集成服务器形式。单个 AI 处理器支持≥370TFLOPS@FP16或 80TFLOPS@FP32 算力,支持≥64GB HBM高带宽内存,单个AI处理器内存带宽≥1600GBps 单张卡算力及内存带宽参考如下NVIDIA算力表 H3C R4900 G5:支持多达 32 个 DDR4 内存,速率…

【机器学习深度学习】Embedding 模型详解:从基础原理到实际应用场景

目录 前言 一、Embedding 模型基础&#xff1a;文本到向量的“魔术师” 1.1 什么是 Embedding&#xff1f; 1.2 为什么需要 Embedding&#xff1f; 二、核心作用与优势&#xff1a;语义分析的“利刃” 三、工作原理拆解&#xff1a;从训练到应用的完整链条 3.1 训练阶段…