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.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 訓練階段…