java的序列化Serializable
Serializable的作用: 是java提供的一個序列化介面,用來為物件提供標準的序列化和反序列化操作。使用Serializable做序列化比較簡單。
使用方式:
- 直接實現Serializable介面
- 宣告一個靜態值serialVersionUID。這個值並不是必須的,但是最好手動序列化。因為不設定這個值java會自動根據當前物件的hash生成一個值,但是這樣容易引發一些問題,比如反序列化時程式崩潰。我們可以從後面的例子中看到。
注意: 1、序列化的時候會將Serializable的值一起寫入檔案,然後反序列化的時候再利用檔案中的Serializable值和當前類的Serializable進行對比,如果不一致則會出現反序列化失敗的問題,會直接程式崩潰,後面會舉例。 2、靜態變數是屬於類不屬於物件,所以不參與序列化過程。
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String mUserName;
private int mUserAge;
public User(String userName, int userAge) {
this.mUserName = userName;
this.mUserAge = userAge;
}
public String getUserName() {
return mUserName;
}
public int getUserAge() {
return mUserAge;
}
}
- 如果不手動設定serialVersionUID 會發生什麼?
public class User implements Serializable {
private String mUserName;
private int mUserAge;
public User(String userName, int userAge) {
this.mUserName = userName;
this.mUserAge = userAge;
}
public String getUserName() {
return mUserName;
}
public int getUserAge() {
return mUserAge;
}
}
public class Client {
public static void main(String[] args) {
User user = new User("Kyle", 18);
//先序列化到一個檔案中
try {
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
out.writeObject(user);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
// try {
// ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
// User userNew = (User) in.readObject();
// in.close();
// System.out.println("反序列化結果:" + userNew.getUserName() + userNew.getUserAge());
// } catch (IOException e) {
// e.printStackTrace();
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// }
}
}
public class Client {
public static void main(String[] args) {
// User user = new User("Kyle", 18);
// try {
// ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("cache.txt"));
// out.writeObject(user);
// out.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
//然後反序列化
try {
ObjectInputStream in = new ObjectInputStream(new FileInputStream("cache.txt"));
User userNew = (User) in.readObject();
in.close();
System.out.println("反序列化結果:" + userNew.getUserName() + userNew.getUserAge());
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
輸出結果:
但是當後面我們在User類中增加一個欄位時:由於此時在反序化時User類自動生成的Serializable已經自動改變,所以反序化就會失敗,丟擲JE。所以我們應該手動設定Serializable,一邊可以最大化的反序化原始資料。
public class User implements Serializable {
private String mUserName;
private int mUserAge;
private boolean mIsMale;
public User(String userName, int userAge) {
this.mUserName = userName;
this.mUserAge = userAge;
}
public String getUserName() {
return mUserName;
}
public int getUserAge() {
return mUserAge;
}
}
我們也可以在實驗一下設定serialVersionUID的情況,即使我們新增加欄位,還是可以反序列化出資料。
相關文章
- Serializable java序列化Java
- 什麼是Java Serializable(序列化)Java
- Java序列化(Serializable)與反序列化詳解Java
- Serializable詳解(1):程式碼驗證Java序列化與反序列化Java
- 序列化Serializable和Parcelable的理解和區別
- Java 物件實現 Serializable 的原因Java物件
- java.io.Serializable淺析Java
- Java Serializable:明明就一個空的介面嘛Java
- LLM-通義千問:Java的Serializable介面Java
- java的序列化Java
- Java的序列化和反序列化Java
- Java的序列化與反序列化Java
- Serializable介面
- Java中的序列化與反序列化Java
- java中的序列化Java
- java序列化Java
- flutter json_annotation和json_serializable處理json資料序列化FlutterJSON
- Java序列化、反序列化、反序列化漏洞Java
- Java序列化的狀態Java
- Java物件的序列化和反序列化實踐Java物件
- 從java的序列化和反序列化說起Java
- Java序列化和hessian序列化的區別Java
- 深入分析Java的序列化與反序列化Java
- Flutter Json自動反序列化——json_serializable v1.5.1 | 掘金技術徵文FlutterJSON
- Java--序列化與反序列化Java
- 什麼是Java序列化,如何實現java序列化Java
- Java安全基礎之Java序列化與反序列化Java
- Serializable和Parcelable的區別
- Java物件的序列化與反序列化-Json篇Java物件JSON
- Java——transient and 序列化Java
- java物件序列化Java物件
- java反序列化Java
- 談談 JAVA 的物件序列化Java物件
- Java序列化流的奇妙之旅Java
- Tinking in Java ---Java的NIO和物件序列化Java物件
- java 序列化與反序列化例項Java
- [Java基礎]序列化和反序列化Java
- 分析輪子(四)- 我也玩一把 Serializable.javaJava