Java類的序列化和反序列化
序列化:指將物件轉換為位元組序列的程序,也就是將物件的資訊轉換成檔案保存,
反序列化:將位元組序列轉換成目標物件的程序,也就是讀取檔案,并轉換為物件,
幾個關鍵點:
- 必須實作Serializable介面才可以進行序列化
- 欄位屬性 serialVersionUID 決定了被修改后的類(比如增加或洗掉了一個欄位),序列化和反序列化是否成功【相當于驗證版本一致性的編號】
這個欄位可以自定義,也可以用IDE生成,還可以呼叫方法生成
自定義比如: private static final long serialVersionUID = 1L;
使用編譯器生成需要設定一下:



使用代碼生成可以這樣寫:
ObjectStreamClass c = ObjectStreamClass.lookup(Student.class);
long serialID = c.getSerialVersionUID();
System.out.println(serialID);
建議自己指定一個ID,因為如果是自動生成的話,可能會存在版本不同的問題,
!!!記住這個欄位的型別是static final long !!!
下面上代碼:
待序列化的類Student
package serializable;
/**
* @author Administrator
* @date 2022-09-26 21:47
*/
// 實作Serializable介面的學生類
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = -575577087488357438L;
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
序列化和反序列化測驗類STest
package serializable;
import java.io.*;
/**
* @author Administrator
* @date 2022-09-26 21:48
*/
public class STest {
public static void main(String[] args) {
serial();
deserial();
}
// 序列化方法
private static void serial(){
Student student = new Student(21, "John");
try {
// FileOutputStream流是指檔案位元組輸出流,
// 專用于輸出原始位元組流如影像資料等,其繼承OutputStream類,擁有輸出流的基本特性
FileOutputStream fileOutputStream = new FileOutputStream("Student.txt");
// 物件的序列化流,作用:把物件轉成位元組資料的輸出到檔案中保存,
// 物件的輸出程序稱為序列化,可實作物件的持久存盤,
ObjectOutputStream objectOutputStream= new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(student);
objectOutputStream.flush();
} catch (Exception exception) {
exception.printStackTrace();
}
}
// 反序列化方法
private static void deserial() {
try {
FileInputStream fis = new FileInputStream("Student.txt");
// ObjectInputStream 反序列化流,
// 將之前使用 ObjectOutputStream 序列化的原始資料恢復為物件,以流的方式讀取物件,
// 構造方法 ObjectInputStream(InputStream in) 創建從指定 InputStream 讀取的 ObjectInputStream,
ObjectInputStream ois = new ObjectInputStream(fis);
Student student = (Student) ois.readObject();
ois.close();
System.out.println(student.toString());
}catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
直接運行STest的main方法,可以看到生成了Student.txt位元組流序列化檔案,再次呼叫反序列化方法deserial可以看到控制臺成功輸出了Student物件的資訊,【因為重寫了toString方法,所以輸出的是欄位屬性值】


好看請贊,養成習慣:) 本文來自博客園,作者:靠譜楊, 轉載請注明原文鏈接:https://www.cnblogs.com/rainbow-1/p/16732944.html
關于筆者: 我的主頁
文章同步51CTO,可以幫忙踩一踩 ~ 我的51CTO博客
更多日常分享盡在我的VX公眾號:小楊的挨踢IT生活
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509626.html
標籤:其他
