序列號 序列號是序列化和反序列化的唯一標識,是一個長整型數值; 如果類中不自己定義序列號,系統會自動生成一個序列號; 當一方實體類發生改變,而調用方的序列號是不會跟著改變的,不知道對象已修改,會導致兩邊序列號不一致,反序列化失敗; 所以要求必須手動生成一個序列號; 手動生成序列號後,可以解決目標類發 ...
序列號
- 序列號是序列化和反序列化的唯一標識,是一個長整型數值;
- 如果類中不自己定義序列號,系統會自動生成一個序列號;
- 當一方實體類發生改變,而調用方的序列號是不會跟著改變的,不知道對象已修改,會導致兩邊序列號不一致,反序列化失敗;
- 所以要求必須手動生成一個序列號;
- 手動生成序列號後,可以解決目標類發生改變,不影響介面調用,對象可以正確序列化,不過對象修改的屬性返序列化後沒有值;
序列化對象類
//如果要支持序列化操作必須實現序列化介面
//賬戶類
public class Account implements Serializable {
//手動生成序列號
private static final long serialVersionUID = 2116137267832764072L;
//賬戶名
private String aname;
//賬戶密碼
private String apwd;
//set,get方法省略
@Override
public String toString() {
return "Account{" +
"aname='" + aname + '\'' +
", apwd='" + apwd + '\'' +
'}';
}
}
序列化
使用ObjectOutputStream 類的 writeObject(Object obj)方法
//序列化對象,寫入文件
public static void xlhAccount() throws IOException {
Account account = new Account("KH96","12345");
//使用對象輸出流,將記憶體中的對象寫入到文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/test/account.txt"));
//直接寫入對象
oos.writeObject(account);
oos.close();
System.out.println("序列化對象寫入成功");
}
序列化結果
反序列化
使用 ObjectInputStream 類的 readObject()方法
//反序列化目標對象讀取寫入序列化的文件,進行反序列化,變為寫入的那個目標對象
public static void fxlhAccount() throws IOException, ClassNotFoundException {
//使用對象輸入流,讀入寫入了序列化對象的文件
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:/test/account.txt"));
Account account = (Account) ois.readObject();
ois.close();
//輸出目標對象
System.out.println(account.toString());
System.out.println("讀取序列化對象,反序列化成功");
}
反序列化結果
Account{aname='KH96', apwd='12345'}
讀取序列化對象,反序列化成功
當類發生改變
改變後的序列化對象
//賬戶類
public class Account implements Serializable {
//手動生成序列號
private static final long serialVersionUID = 2116137267832764072L;
//賬戶名
private String aname;
//賬戶密碼
private String apwd;
//添加手機
private String atel;
//set,get方法省略
@Override
public String toString() {
return "Account{" +
"aname='" + aname + '\'' +
", apwd='" + apwd + '\'' +
", atel='" + atel + '\'' +
'}';
}
}
反序列化結果
Account{aname='KH96', apwd='12345', atel='null'}
讀取序列化對象,反序列化成功
如果沒有手動聲明序列號,實體類發生改變後就會java.io.InvalidClassException異常,序列號不一致而無法進行序列化。