# **1. 序列化與反序列化**
## **1.1 序列化**
1. Java序列化能夠將實例對象寫入字節流中(**只序列化對象屬性值,而不序列化方法**)
2. 序列化后的對象(字節信息)可用于網絡傳輸、持久化到數據庫、磁盤中
## **1.2 反序列化**
需要對象的時候,再從序列化出來的字節信息中構造出原來的對象
# **2. 實現序列化**
`Java`中要使一個類可以序列化,實現`java.io.Serializable` 接口
1. user對象
~~~
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String age;
}
~~~
2. 測試
~~~
public class serializeTest {
public static void main(String[] args) throws Exception {
User user = new User();
user.setName("fufu");
user.setAge("18");
serialize(user);
System.out.println("Java序列化前的結果:{} " + user.toString());
User duser = deserialize();
System.out.println("Java反序列化的結果:{} " + duser.toString());
}
private static void serialize(User user) throws Exception {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("C:\\Users\\93130\\Desktop\\user.txt")));
oos.writeObject(user);
oos.close();
}
private static User deserialize() throws Exception {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("C:\\Users\\93130\\Desktop\\user.txt")));
return (User) ois.readObject();
}
}
~~~
輸出
```
Java序列化前的結果:{} User(name=fufu, age=18)
Java反序列化的結果:{} User(name=fufu, age=18)
```
產生文件

# 3. **`serialVersionUID`** 屬性
1. 因為序列化對象時,如果不顯示的設置`serialVersionUID`,Java在序列化時會根據對象屬性自動的生成一個`serialVersionUID`,再進行存儲或用作網絡傳輸。
2. 在反序列化時,會根據對象屬性自動再生成一個新的`serialVersionUID`,和序列化時生成的`serialVersionUID`進行比對,兩個`serialVersionUID`相同則反序列化成功,否則就會拋異常。
3. 而當顯示的設置`serialVersionUID`后,Java在序列化和反序列化對象時,生成的`serialVersionUID`都為我們設定的`serialVersionUID`,這樣就保證了反序列化的成功。
例如將對象user序列化后,對user對象源碼進行了修改,此時再去反序列化會報錯,因為serialVersionUID不一樣了;如果顯示指定則可以避免處理類情況
# 4. **transient**
序列化對象時如果希望哪個屬性不被序列化,則用`transient`關鍵字修飾即可
~~~
@Data
public class User implements Serializable {
private transient String name;
private String age;
}
~~~
可以看到字段`name`的值沒有被保存到磁盤中,一旦變量被`transient`修飾,變量將不再是對象持久化的一部分,該變量內容在序列化后無法獲得訪問。
復制
~~~
Java序列化前的結果: User(name=fufu, age=18)
Java反序列化的結果:User(name=null, age=18)
~~~
一個靜態變量不管是否被`transient`修飾,均不能被序列化。 因為`static`修飾的屬性是屬于類,而非對象。
- 計算機網絡
- 基礎_01
- tcp/ip
- http轉https
- Let's Encrypt免費ssl證書(基于haproxy負載)
- what's the http?
- 網關
- 網絡IO
- http
- 工具
- Git
- 初始本地倉庫并上傳
- git保存密碼
- Gitflow
- maven
- 1.生命周期命令
- 聚合與繼承
- 插件管理
- assembly
- 資源管理插件
- 依賴范圍
- 分環境打包
- dependencyManagement
- 版本分類
- 找不到主類
- 無法加載主類
- 私服
- svn
- gradle
- 手動引入第三方jar包
- 打包exe文件
- Windows
- java
- 設計模式
- 七大原則
- 1.開閉原則
- 2. 里式替換原則
- 3. 依賴倒置原則
- 4. 單一職責原則
- 單例模式
- 工廠模式
- 簡單工廠
- 工廠方法模式
- 抽象工廠模式
- 觀察者模式
- 適配器模式
- 建造者模式
- 代理模式
- 適配器模式
- 命令模式
- json
- jackson
- poi
- excel
- easy-poi
- 規則
- 模板
- 合并單元格
- word
- 讀取
- java基礎
- 類路徑與jar
- 訪問控制權限
- 類加載
- 注解
- 異常處理
- String不可變
- 跨域
- transient關鍵字
- 二進制編碼
- 泛型1
- 與或非
- final詳解
- Java -jar
- 正則
- 讀取jar
- map
- map計算
- hashcode計算原理
- 枚舉
- 序列化
- URLClassLoader
- 環境變量和系統變量
- java高級
- java8
- 1.Lambda表達式和函數式接口
- 2.接口的默認方法和靜態方法
- 3.方法引用
- 4.重復注解
- 5.類型推斷
- 6.拓寬注解的應用場景
- java7-自動關閉資源機制
- 泛型
- stream
- 時區的正確理解
- StringJoiner字符串拼接
- 注解
- @RequestParam和@RequestBody的區別
- 多線程
- 概念
- 線程實現方法
- 守護線程
- 線程阻塞
- 筆試題
- 類加載
- FutureTask和Future
- 線程池
- 同步與異步
- 高效簡潔的代碼
- IO
- ThreadLocal
- IO
- NIO
- 圖片操作
- KeyTool生成證書
- 壓縮圖片
- restful
- 分布式session
- app保持session
- ClassLoader.getResources 能搜索到的資源路徑
- java開發規范
- jvm
- 高并發
- netty
- 多線程與多路復用
- 異步與事件驅動
- 五種IO模型
- copy on write
- code style
- 布隆過濾器
- 筆試
- 數據庫
- mybatis
- mybatis與springboot整合配置
- pagehelper
- 分頁數據重復問題
- Java與數據庫之間映射
- 攔截器
- 攔截器應用
- jvm
- 堆內存測試
- 線程棧
- 直接內存
- 內存結構
- 內存模型
- 垃圾回收
- 調優
- 符號引用
- 運行參數
- 方法區
- 分帶回收理論
- 快捷開發
- idea插件
- 注釋模板
- git
- pull沖突
- push沖突
- Excel處理
- 圖片處理
- 合并單元格
- easypoi
- 模板處理
- 響應式編程
- reactor
- reactor基礎
- jingyan
- 規范
- 數據庫