12.Java 對象冷凍術:從用戶登錄到游戲存檔的序列化實戰

目錄

一、引言

二、用戶登錄存檔:讓賬號信息「凍齡」不變

1. 給對象貼「冷凍標簽」:實現 Serializable

2. 冷凍與解凍實戰:把用戶存進文件

3. 演示場景

三、游戲存檔復活:讓角色進度「穿越時空」

1. 復雜對象冷凍:游戲角色的「時空膠囊」

2. 存檔管理器:戰斗前先「存個檔」

3. 實戰劇情

四、serialVersionUID:防止「冷凍變質」的關鍵

1. 版本號為什么重要?

2. 版本號升級場景

五、序列化避坑指南:這些「冰錐」要小心!

1. 靜態字段不冷凍:

六、總結


一、引言

????????歡迎來到 Java「對象冷凍廠」!今天我們要解鎖一項程序員必備技能 ——序列化與反序列化,俗稱「對象冷凍術」。簡單來說,就是把 Java 對象變成能存進文件、傳上網線的「數據冰塊」,需要時再「解凍」復活。無論是保存用戶登錄狀態,還是讓游戲角色進度「起死回生」,這套技能都能讓你輕松實現「對象持久化自由」。

二、用戶登錄存檔:讓賬號信息「凍齡」不變

1. 給對象貼「冷凍標簽」:實現 Serializable

// 用戶類:貼上「可冷凍」標簽
public class User implements Serializable {// 冷凍身份證:版本號必須手動填寫!private static final long serialVersionUID = 123456789L; private String username;private transient String password; // 敏感字段不冷凍private int age;// ... 省略構造方法和Getter/Setter
}

關鍵點Serializable接口就像對象的「冷凍許可證」,而serialVersionUID是每個對象冷凍后的「唯一條形碼」,修改類結構時必須小心維護,否則會導致「解凍失敗」!

2. 冷凍與解凍實戰:把用戶存進文件

// 冷凍機:將對象寫入文件
public static void freezeUser(User user, String path) {try (ObjectOutputStream freezer = new ObjectOutputStream(new FileOutputStream(path))) {freezer.writeObject(user); // 把對象「凍」進文件System.out.println("用戶已冷凍保存!");} catch (IOException e) {e.printStackTrace();}
}// 解凍機:從文件恢復對象
public static User thawUser(String path) {try (ObjectInputStream thawer = new ObjectInputStream(new FileInputStream(path))) {return (User) thawer.readObject(); // 把「冰塊」變回對象} catch (Exception e) {System.out.println("解凍失敗:" + e.getMessage());return null;}
}

3. 演示場景

public static void main(String[] args) {User bob = new User("Bob", "secret", 25);freezeUser(bob, "user.dat"); // 保存登錄狀態// 模擬重啟后解凍User recovered = thawUser("user.dat");System.out.println("解凍成功:" + recovered); // 輸出完整用戶信息(除了transient的password)
}

三、游戲存檔復活:讓角色進度「穿越時空」

1. 復雜對象冷凍:游戲角色的「時空膠囊」

// 游戲角色類:包含裝備列表的復雜對象
public class GameRole implements Serializable {private static final long serialVersionUID = 987654321L;private String name;private int level;private List<String> equipments; // 裝備列表自動支持冷凍// 帶裝備的構造方法public GameRole(String name, int level, List<String> equipments) {this.name = name;this.level = level;this.equipments = equipments;}
}

注意:只要對象的屬性都是可序列化的(如ListString),復雜對象也能一鍵冷凍!

2. 存檔管理器:戰斗前先「存個檔」

// 存檔方法:把角色凍進存檔文件
public static void saveGame(GameRole role, String slot) {try (ObjectOutputStream saveFile = new ObjectOutputStream(new FileOutputStream("save_" + slot + ".dat"))) {saveFile.writeObject(role);System.out.println("已在" + slot + "號存檔點保存進度!");} catch (IOException e) {System.out.println("存檔失敗:" + e.getMessage());}
}// 讀檔方法:從存檔恢復角色
public static GameRole loadGame(String slot) {try (ObjectInputStream loadFile = new ObjectInputStream(new FileInputStream("save_" + slot + ".dat"))) {return (GameRole) loadFile.readObject();} catch (Exception e) {System.out.println("讀檔失敗:" + e.getMessage());return null;}
}

3. 實戰劇情

public static void main(String[] args) {// 新建角色:1級小菜鳥,只有木劍List<String> starterEq = Arrays.asList("木劍", "布甲");GameRole hero = new GameRole("勇者林克", 1, starterEq);saveGame(hero, "slot1"); // 存檔// 模擬打怪升級(修改對象狀態)hero.setLevel(100);hero.getEquipments().add("大師之劍");// 讀檔!回到1級狀態GameRole reloaded = loadGame("slot1");System.out.println("讀檔角色:" + reloaded); // 輸出1級+木劍布甲,修改后的狀態未保存
}

四、serialVersionUID:防止「冷凍變質」的關鍵

1. 版本號為什么重要?

????????想象你把對象凍成冰塊后,修改了類的結構(比如刪了個字段),再解凍時 Java 會報錯:「冰塊條形碼和當前類不匹配!」
手動指定版本號

private static final long serialVersionUID = 1L; // 寫死版本號,修改類時謹慎更新

2. 版本號升級場景

  • 兼容修改(如新增可選字段):保持版本號不變,反序列化時自動填充默認值。
  • 不兼容修改(如刪除核心字段):必須更新版本號,并編寫數據遷移邏輯。

五、序列化避坑指南:這些「冰錐」要小心!

1. 靜態字段不冷凍

private static String serverName = "主服"; // 靜態字段屬于類,不會存入對象冰塊

2. transient 關鍵字:排除敏感字段

private transient String creditCardNumber; // 銀行卡號不參與冷凍

3. 深度克隆技巧:通過序列化實現對象深拷貝,比手動復制屬性更省心:

public static <T> T deepClone(T object) {try (ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais)) {oos.writeObject(object);return (T) ois.readObject();} catch (Exception e) {throw new RuntimeException("克隆失敗", e);}
}

六、總結

????????Java 序列化與反序列化是通過實現Serializable接口將對象轉為數據流實現持久化存儲的技術,可用于用戶登錄信息保存、游戲存檔恢復等場景,需手動維護serialVersionUID控制兼容性,利用transient排除敏感字段,注意靜態字段不參與序列化。

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

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

相關文章

conda 環境中opencv 報錯以及其他報錯

如題&#xff0c;通過 conda install opencv 然后遇到 ImportError: DLL load failed while importing cv2: 找不到指定的模塊。 參考網絡相關答案 通過conda 卸載 然后通過 pip3 安裝opencv-pyhton https://stackoverflow.com/questions/75387197/anaconda-importerror-dll-…

(已開源-CVPR2024) RadarDistill---NuScenes數據集Radar檢測第一名

本文介紹一篇Radar 3D目標檢測模型&#xff1a;RadarDistill。雷達數據固有的噪聲和稀疏性給3D目標檢測帶來了巨大挑戰。在本文中&#xff0c;作者提出了一種新的知識蒸餾(KD)方法RadarDistill&#xff0c;它可以通過利用激光雷達數據來提高雷達數據的表征。RadarDistill利用三…

創建型設計模式之Singleton(單例)設計模式

創建型設計模式之Singleton&#xff08;單例&#xff09;設計模式 摘要&#xff1a; Singleton&#xff08;單例&#xff09;設計模式確保一個類僅有一個實例&#xff0c;并提供全局訪問點。其結構包含一個靜態方法getInstance()用于獲取唯一實例&#xff0c;構造方法私有化防…

C++11:系統類型增強

C11&#xff1a;系統類型增強 強枚舉類型作用域限定隱式類型轉換指定類型前置聲明 類型別名 using模板別名復雜指針別名 auto限制性 auto注意事項 nullptrdecltype 強枚舉類型 在C98的枚舉設計中&#xff0c;存在很多缺陷&#xff0c;為此C11推出了強枚舉來代替舊版的枚舉&…

linux 內核warn_on/Bug_on

1,warn_on() warn_on() 是 Linux 內核中用于報告潛在問題或警告的宏。與 bug_on() 不同&#xff0c;bug_on() 通常用于報告嚴重錯誤&#xff0c;其觸發往往會導致內核Oops或panic&#xff0c;而 warn_on() 則用于報告不太嚴重的、可能只是潛在問題或預期外情況的情況。它的觸…

SQL輸出20個9

在SQL Server中要輸出20個連續的9&#xff0c;可以使用以下幾種方法&#xff1a; 使用REPLICATE函數重復生成字符&#xff1a; SELECT REPLICATE(9, 20) AS Result 2. 使用UNION ALL聯合查詢生成多行&#xff1a; SELECT 9 AS Number FROM (VALUES (1),(1),(1),(1),(1),(1),…

懶人云電腦方案:飛牛NAS遠程喚醒 + 節點小寶一鍵喚醒、遠程控制Windows!

后臺高頻問題解答&#xff1a; “博主&#xff0c;飛牛NAS能定時開關機了&#xff0c;能不能讓它順便把家里Windows電腦也遠程喚醒控制&#xff1f;最好點一下就能連&#xff0c;不用記IP端口那種&#xff01;” 安排&#xff01;今天這套方案完美實現&#xff1a; ? 飛牛NAS…

Linux特殊符號

1 管道符| 管道符號 | 用于將一個命令的輸出作為另一個命令的輸入。這種機制允許將多個命令組合在一起&#xff0c;形成一個數據處理鏈&#xff0c;每個命令處理前一個命令的輸出&#xff0c;從而實現復雜的數據處理任務。示例 # 查詢/var/log目錄下所有的log文件,并進行分頁…

初識Docker:容器化技術的入門指南

初識Docker&#xff1a;容器化技術的入門指南 一、Docker是什么&#xff1a;容器化技術的核心概念二、Docker的核心優勢2.1 環境一致性2.2 高效部署與快速迭代2.3 資源利用率高 三、Docker的安裝與基本使用3.1 安裝Docker3.2 Docker基本概念3.3 第一個Docker容器體驗 四、Docke…

商務風企業公司推廣培訓計劃PPT模版分享

商務風企業公司推廣培訓計劃PPT模版分享&#xff1a;商務培訓推廣計劃PPT模版https://pan.quark.cn/s/063282eaf739 第1套PPT模版&#xff0c;綠橙配色&#xff0c;幾何圖形拼接背景&#xff0c;有中英文標題和占位文本。 第2套PPT模版是黑金高端商務風格&#xff0c;有匯報人…

深入理解Nginx:詳盡配置手冊

Nginx是一款高性能的HTTP和反向代理服務器&#xff0c;廣泛應用于負載均衡、緩存和Web服務器等場景。隨著互聯網應用的快速發展&#xff0c;掌握Nginx的配置和優化技巧顯得尤為重要。在本篇文章中&#xff0c;我們將深入探討Nginx的配置&#xff0c;幫助你更好地理解和使用這款…

每日leetcode

1572. 矩陣對角線元素的和 - 力扣&#xff08;LeetCode&#xff09; 題目 給你一個正方形矩陣 mat&#xff0c;請你返回矩陣對角線元素的和。 請你返回在矩陣主對角線上的元素和副對角線上且不在主對角線上元素的和。 示例 1&#xff1a; 輸入&#xff1a;mat [[1,2,3], …

Server 9 ,在 VMware 虛擬機上安裝 Windows 系統完整指南

目錄 前言 一、準備工作 1.1 準備安裝文件 1.2 安裝VMware軟件 1.3 創建新的虛擬機 1.4 開啟虛擬機 二、注意事項 2.1 調整硬件設置 2.2 啟動順序配置 2.3 固件類型選擇 2.4 安全啟動配置 三、安裝優化 3.1 安裝VMware Tools 3.2 系統更新與激活 四、更多操作 ?…

最終章:終焉之塔 · 前端之道

第一章&#xff1a;HTML基石現實的骨架 第二章&#xff1a;CSS秘典 色彩與布局的力量 第三章&#xff1a;JavaScript引擎 行為之火 第四章&#xff1a;DOM迷宮 掌控頁面之心 第五章&#xff1a;異步幻境 時間與數據的秘密 第六章&#xff1a;事件風暴 用戶的意志 第七章&a…

詳解 .net9 內置 Lock 對象,更加現代化和靈活可控的鎖對象

.NET 9 引入了全新的 System.Threading.Lock 類型&#xff0c;作為更現代、類型安全且具備遞歸支持的同步原語。與傳統的基于 Monitor.Enter/lock(obj) 的方式不同&#xff0c;Lock 是一個具體的類&#xff0c;提供了更靈活的 API 和結構化編程模型。 Lock 類 Lock 是一個具體…

python幾行命令實現快速打包apk

1. ??環境準備? sudo apt update sudo apt install -y python3-pip git zip unzip openjdk-17-jdk sudo apt-get install -y autoconf automake libtool pip install kivy buildozer cython2. ??項目配置? 在項目目錄中初始化Buildozer&#xff1a; buildozer init這會…

實時數倉和離線數倉的區別是什么?企業如何選擇合適的數倉架構?

實時數倉和離線數倉的區別是什么&#xff1f;企業如何選擇合適的數倉架構&#xff1f; 時數倉和離線數倉都是數據倉庫的不同類型&#xff0c;用于存儲和管理企業的數據&#xff0c;但它們在數據處理和使用的時間、速度以及用途方面有明顯的區別。 在介紹實時數倉之前&#xf…

Docker Desktop for Windows 系統設置說明文檔

1. 文檔概述 本文檔旨在詳細說明 Docker Desktop for Windows 應用程序中“設置 (Settings)”界面下的所有可配置選項及其子選項。對于每個配置項&#xff0c;我們將提供其功能描述、推薦配置&#xff08;如適用&#xff09;以及相關注意事項&#xff0c;幫助用戶更好地理解和…

精準監測,健康無憂--XC3576H工控主板賦能亞健康檢測儀

在快節奏的現代生活中&#xff0c;亞健康問題逐漸成為困擾人們健康的隱形殺手。疲勞、失眠、免疫力下降等問題頻發&#xff0c;卻往往因難以察覺而延誤調理。智能亞健康檢測儀通過高科技手段&#xff0c;幫助用戶實時了解身體狀況&#xff0c;提前預警潛在健康風險。 其核心功能…

SBT開源構建工具

SBT 的多元定義與核心解釋 SBT&#xff08;Simple Build Tool&#xff09;是專為 Scala 和 Java 項目設計的開源構建工具&#xff0c;基于 Scala 語言開發&#xff0c;提供依賴管理、編譯、測試、打包等全流程支持。其核心特點包括&#xff1a; 核心功能與特性&#xff1a; …