36.Java序列化與反序列化是什么

36.Java序列化與反序列化是什么

  • 序列化就是把Java對象轉換成字節流(二進制)。
    • 把對象保存到本地文件或網絡傳輸。因為Java對象在JVM的堆內存中,JVM堆不存在了,對象也就不在了。
  • 反序列化就是把字節流轉換為對象
    • 從文件或者網絡里獲取字節流,通過反序列化就可以重建對象

為什么需要序列化與反序列化?

進行持久化或者網絡傳輸時需要序列化與反序列化。

跨平臺和跨語言通信,序列化為二進制文件,可以在不同平臺和語言解析。

Java對象序列化不僅僅保留一個對象的數據,也會遞歸保留對象引用的每個對象的數據

序列化實現的方式有哪些?

  • 實現serializable接口或者Externalizable接口

    • Serializable接口

      • 特點:

        • 簡單易用:只需實現接口即可。
        • 默認行為:自動序列化所有非 transient 和非靜態字段。
        • 版本控制:通過 serialVersionUID 控制類版本兼容性。
      • 缺點:

        • 性能較差:生成的字節流較大,效率較低。
        • 跨語言不兼容:只能用于 Java 系統內部。
        • 安全性問題:反序列化不可信數據可能導致漏洞。
      • public class Person implements Serializable {private static final long serialVersionUID = 1L;private String name;private int age;// 構造方法、getter/setter
        }// 序列化
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"));
        oos.writeObject(new Person("Alice", 30));// 反序列化
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"));
        Person person = (Person) ois.readObject();
        
    • 自定義序列化(Externalizable 接口)

      • 特點:

        • 完全控制序列化邏輯:可選擇性地序列化字段。
        • 更靈活:適合需要優化存儲或傳輸效率的場景。
      • 缺點:

        • 開發成本高:需要手動編寫序列化/反序列化邏輯。
      • public class Person implements Externalizable {private String name;private int age;@Overridepublic void writeExternal(ObjectOutput out) throws IOException {out.writeUTF(name);out.writeInt(age);}@Overridepublic void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {name = in.readUTF();age = in.readInt();}
        }
        

在這里插入圖片描述

什么是serialVersionUID

用來表示類的不同版本的兼容性。

來驗證版本是否一致,JVM在反序列化時,拿到傳過來的字節碼文件,用字節碼文件的UID去和本地的類文件的UID去比對,如果一致就會進行反序列化。

為什么還要顯示指定serialVersionUID的值

  • 如果不顯示指定,JVM就會在反序列化時新生成一個UID去和本地類的UID去對比
  • 如果顯示指定了,JVM任然會去生成UID,但是UID值是我們顯示指定的值,會去和本地的顯示指定的UID去對比,這樣舊和新的UID都是一致的,是我們顯示指定的。
  • 在實際開發中,編寫的類會一直不斷迭代,如果修改了類,UID就會改變,所以我們顯示指定一個UID,保持UID一致。

serialVersionUID什么時候修改?

序列化類新增屬性時,不要修改UID,避免反序列化失敗。如果完全不兼容升級,避免反序列化混亂,修改UID。

Java 序列化中如果有些字段不想進行序列化,怎么辦?

對于不想進行序列化的變量,使用 transient 關鍵字修飾。transient只能修飾變量,不能修飾類和方法。反序列化后,transient修飾的值會設為初始值,如int類型就會為0,對象類型就會為null。

靜態變量會被序列化嗎?

sient 關鍵字修飾。transient只能修飾變量,不能修飾類和方法。反序列化后,transient修飾的值會設為初始值,如int類型就會為0,對象類型就會為null。

靜態變量會被序列化嗎?

不會,因為序列化是針對對象而言的,而靜態變量會隨著類的加載而加載,優先于對象存在。serialVersionUID也被static修飾, 為什么serialVersionUID會被序列化?其實serialVersionUID屬性并沒有被序列化, JVM在序列化對象時會自動生成一個serialVersionUID, 然后將我們顯示指定的serialVersionUID屬性值賦給自動生成的serialVersionUID。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96031.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c#泛型公共類示例

在C#中&#xff0c;泛型類是一種可以操作多種數據類型的類。這使得你可以編寫更靈活、可重用的代碼。泛型類通過在類名后使用尖括號<>和類型參數來定義。類型參數可以是具體的類型&#xff0c;如int或string&#xff0c;也可以是其他泛型類型&#xff0c;甚至是其他泛型類…

深入理解算法效率——時間和空間復雜度詳解

目錄 一、引言&#xff1a;為什么我們需要分析算法效率&#xff1f; 二、算法效率的維度 2.1 時間復雜度&#xff08;Time Complexity&#xff09; 2.2 空間復雜度&#xff08;Space Complexity&#xff09; 三、深入理解算法時間復雜度 3.1 時間復雜度的基礎概念 3.2 大…

排序---冒泡排序(Bubble Sort)

一、算法核心概念 冒泡排序是一種簡單的交換排序算法&#xff0c;其核心思想是&#xff1a;通過重復遍歷待排序數組&#xff0c;每次比較相鄰的兩個元素&#xff0c;若它們的順序錯誤&#xff08;如升序排序中前一個元素大于后一個&#xff09;&#xff0c;則交換它們的位置。經…

MCP(模型上下文協議)入門教程

MCP&#xff08;模型上下文協議&#xff09;入門教程&#xff1a;連接AI與外部世界的萬能插座 1 MCP是什么&#xff1f; 1.1 基本概念 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議&#xff09;是一個開放協議&#xff0c;專門用于AI模型與外部數據源和…

GO開發遇到的報錯問題合集

本文將記錄平時在go開發中遇到的一些錯誤信息&#xff0c;踩過的坑&#xff0c;并分析原因及提供解決方法&#xff0c;持續更新中...1、grpc 接口請求報錯&#xff1a;Error: 13 INTERNAL: Response message parsing error: invalid wire type 7 at offset 316原因&#xff1a;…

Node.js 做 Web 后端優勢為什么這么大?

Node.js自誕生以來&#xff0c;一步步演變變為現代Web后端開發的基石之一。無論是初創公司快速構建原型&#xff0c;還是大型企業支撐高并發業務&#xff0c;好像它哪兒哪兒都在&#xff0c;甚至還有人覺得它威脅到了PHP的地位。 那為什么Node.js 做 Web 后端優勢那么大&#x…

JAVA:IO流之字節輸入流InputStream基礎

我們知道&#xff0c;文件是寫在磁盤中的&#xff0c;而程序的運行又要借助于內存。那么怎么實現內存和磁盤的“互動”呢&#xff1f;這就要借助“流”來實現了。內存具體指的就是我們的java程序&#xff0c;而磁盤具體指的是我們的文件。從磁盤到內存叫輸入&#xff0c;從內存…

23種設計模式——橋接模式 (Bridge Pattern)詳解

?作者簡介&#xff1a;大家好&#xff0c;我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式&#xff0c;持續分享Java技術內容。 &#x1f34e;個人主頁&#xff1a;Meteors.的博客 &#x1f49e;當前專欄&#xff1a;設計模式 ?特色專欄&#xff1a;知識分享 &#x…

Python爬蟲實戰:研究Axes Grid模塊,構建旅游平臺酒店數據采集和分析系統

1. 引言 1.1 研究背景 隨著互聯網技術的飛速發展,全球數據總量呈現指數級增長。據國際數據公司(IDC)預測,到 2025 年全球數據圈將達到 175ZB,其中非結構化數據占比超過 80%。這些數據廣泛分布于各類網站平臺,包含著用戶行為、市場趨勢、產品特征等豐富信息。如何高效獲…

光照邊疆平臺|面向邊疆地區的現代化內容與信息服務系統

光照邊疆平臺&#xff5c;面向邊疆地區的現代化內容與信息服務系統聚焦“邊疆資訊 邊疆風光 用戶互動 后臺可視化管控”的高顏值內容平臺&#xff0c;適合展示、傳播與運營邊疆主題內容。系統定位與價值 主題聚焦&#xff1a;以“邊疆”為核心&#xff0c;統一內容語義與視覺…

刪除元素(不是刪除而是覆蓋)快慢指針 慢指針是覆蓋位置,快指針找元素

&#x1f4dd; 題目&#xff1a;移除元素題目描述&#xff1a; 給定數組和值val&#xff0c;原地移除所有等于val的元素&#xff0c;返回新長度。例子&#xff1a; nums [3,2,2,3], val 3 → nums [2,2,_,_], return 2&#x1f525; 暴力法思路&#xff1a;暴力法想法&#…

10 【C++】泛型編程

文章目錄前言泛型編程&#xff08;模板&#xff09;1. 函數模板1.1 函數模板格式1.2 函數模板的實例化隱式實例化顯式指定模板參數實例化1.3 函數模板實例化的原理1.4 模板參數的匹配原則2. 類模板2.1 類模板的格式2.2 類模板的實例化2.3 類模板實例化的原理2.4 類模板的匹配原…

【基于YOLO和Web的交通工具識別系統】

系統功能 視頻檢測&#xff1a;對輸入的視頻流進行實時或離線分析&#xff0c;自動識別視頻中出現的交通工具&#xff08;如飛機、自行車等&#xff09;及行人&#xff0c;輸出包含目標類別、位置等信息的檢測結果。攝像檢測&#xff1a;通過連接攝像頭設備&#xff0c;對實時…

Python進程,線程

目錄 一、多任務 1.1定義 1.2具體體現 1.3并發和并行 1.3.1并發操作 1.3.2并行操作 1.3.3對比 二、進程 2.1概念 2.2特點 2.3進程狀態 2.4多進程 2.5多進程實現 2.6進程鎖 三、線程 3.1概念 3.2特點 3.3適用場景 3.4多線程實現 四、對比 4.1關系對? 4.2區…

【Element Plus 表單組件樣式統一 CSS 文字特效實現指南】

Element Plus 表單組件樣式統一 & CSS 文字特效實現指南 前言 在使用 Element Plus 組件庫開發表單頁面時&#xff0c;我們遇到了一個看似簡單卻很有趣的問題&#xff1a;el-input、el-select 和 el-textarea 在禁用狀態下的文字顏色不一致。通過深入研究&#xff0c;我們…

網絡通信與協議棧 -- OSI,TCP/IP模型,協議族,UDP編程

網絡通信的核心是實現不同主機上進程間的數據交換&#xff0c;其技術體系圍繞 “協議分層模型” 展開&#xff0c;向下依賴硬件介質傳輸電 / 光信號&#xff0c;向上支撐各類網絡應用&#xff08;如網頁瀏覽、文件傳輸&#xff09;。本文結合 OSI 理論框架與 TCP/IP 工業標準&a…

HarmonyOS 新一代聲明式 UI 彈窗機制:從 AlertDialog 到 CustomDialogController 的深度解析與實踐

好的&#xff0c;請看這篇關于 HarmonyOS 新一代聲明式 UI 彈窗機制的技術文章。 HarmonyOS 新一代聲明式 UI 彈窗機制&#xff1a;從 AlertDialog 到 CustomDialogController 的深度解析與實踐 引言 在 HarmonyOS 應用開發中&#xff0c;彈窗&#xff08;Dialog&#xff09;是…

混合推理模型(快思考、慢思考模型)

目錄基礎transformer架構、transformers庫預訓練模型的微調&#xff08;Fine-tuning&#xff09;預訓練微調的大模型應用模式base 模型、instruct 模型區別Hugging Face 上如何查看base模型、instruct模型混合推理模型大模型里的快思考 vs 慢思考qwen3模型含特殊 ChatML / 模型…

prometheus+grafana搭建

部署 prometheus 安裝 # 1,下載 wget https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-3.5.0.linux-amd64.tar.gz# 2,部署 tar -zxvf prometheus-3.5.0.linux-amd64.tar.gz -C /opt/ cd /opt/ mv ./prometheus-3.5.0.linux-amd64 …

MR30分布式I/O在面機裝備中的應用

隨著食品加工行業向自動化、智能化轉型&#xff0c;面機裝備對控制系統的響應速度、布線靈活性及穩定性提出了更高要求。本案例以某大型食品機械制造企業的全自動面條生產線升級項目為背景&#xff0c;引入 MR30 分布式 IO 模塊替代傳統集中式 IO 方案。通過將 MR30 分布式 IO …