1. 程式人生 > >Java基礎--對象序列化

Java基礎--對象序列化

row NPU bject col efault ado 標識 程序 字符串

1.序列化與反序列化

把內存中的對象永久保存到硬盤的過程稱為對象序列化,也叫做持久化。

把硬盤持久化的內存恢復的內存的過程稱為對象反序列化。

2.Serializable接口

類通過實現 java.io.Serializable 接口以啟用其序列化功能。未實現此接口的類將無法使其任何狀態序列化或反序列化,並拋出異常

Serializable接口沒有方法或字段,僅用於標識可序列化的語義

3.序列化對象

ObjectOutputStream 繼承於OutputStream,專門用於把對象序列化到本地。提供了writeObject() 用於寫入一個對象。

 1 public static
void main(String[] args) throws IOException { 2 3 Student stu = new Student("001", "大狗", 20, Gender.男); 4 5 /** 6 * 方案1:取stu所有的屬性,通過特定的字符串(-),把各個屬性值連接起來 7 * 001-大狗-20-男 8 */ 9 10 File file = new File("d:\\javatest\\l.txt");
11 FileOutputStream out = new FileOutputStream(file); 12 ObjectOutputStream oos = new ObjectOutputStream(out); 13 14 oos.writeObject(stu); 15 16 oos.close(); 17 out.close(); 18 }

4.反序列化對象

 1 public static void main(String[] args) throws
IOException, ClassNotFoundException { 2 3 File file = new File("d:\\javatest\\l.txt"); 4 5 6 FileInputStream in = new FileInputStream(file); 7 ObjectInputStream ois = new ObjectInputStream(in); 8 9 Student student = (Student) ois.readObject(); 10 System.out.println(student.getId()); 11 System.out.println(student.getName()); 12 System.out.println(student.getAge()); 13 System.out.println(student.getGender()); 14 15 ois.close(); 16 in.close(); 17 }

5.序列化版本

當序列化完成後,後期升級程序中的類(Student),此時再反序列化時會出現異常。

異常原因:序列化流的serialVersionUID和升級後類的版本不匹配。

解決方案:給Student類加序列化版本號,有兩種方式

【1】default serial version ID 生成默認的serial version ID 一般值都是1L。

【2】generated serial version ID 根據當前類的屬性、方法生成一個唯一ID。

1 public class Student implements Serializable {
2 
3     private static final long serialVersionUID = -1003763572517930507L;

6.transient

開發過程中,如果想忽略某些字段不讓其序列化時,可以使用transient修飾。

1 public class Student implements Serializable {
2 
3     private static final long serialVersionUID = 7222966748321328300L;
4 
5     private String id;
6     private transient String name;
7     private transient int age;
8     private Gender gender;
9     private String phone;

Java基礎--對象序列化