01.序列化
Java 提供了一種對象序列化的機(jī)制财岔。
該機(jī)制中抵栈,一個對象可以被表示為一個字節(jié)序列沧竟,該字節(jié)序列包括該對象的數(shù)據(jù)扰楼、有關(guān)對象的類型的信息和存儲在對象中數(shù)據(jù)的類型捶朵。
將序列化對象寫入文件之后卷哩,可以從文件中讀取出來昂灵,并且對它進(jìn)行反序列化色鸳,也就是說琉历,對象的類型信息坠七、對象的數(shù)據(jù),還有對象中的數(shù)據(jù)類型可以用來在內(nèi)存中新建對象旗笔。
整個過程都是 Java 虛擬機(jī)(JVM)獨(dú)立的彪置,也就是說,在一個平臺上序列化的對象可以在另一個完全不同的平臺上反序列化該對象蝇恶。
02.實(shí)現(xiàn)
- Employee
public class Employee implements Serializable{
private String name;
private String address;
private String telephone;
private int age;
private String Email;
}
- serializeObject
private static void serializeObject(Object object) {
if (object == null) {
throw new IllegalArgumentException("object can't be null");
}
if (!(object instanceof Serializable)) {
throw new IllegalArgumentException("object must be Serializable");
}
try {
FileOutputStream fileOutputStream = new FileOutputStream("/Users/wangning/DeskTop/employee.ser");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(object);
objectOutputStream.close();
fileOutputStream.close();
System.out.println("序列化已完成");
} catch (IOException e) {
e.printStackTrace();
}
}
- deserializeObject
private static void deserializeObject() {
Employee employee = null;
try {
FileInputStream fileInputStream = new FileInputStream("/Users/wangning/DeskTop/employee.ser");
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
employee = (Employee) objectInputStream.readObject();
objectInputStream.close();
fileInputStream.close();
} catch (ClassNotFoundException | IOException e) {
System.out.println("Employee class not found");
e.printStackTrace();
}
if (employee != null) {
System.out.println(employee.getName());
System.out.println(employee.getAddress());
System.out.println(employee.getTelephone());
}
}
-
Employee序列化結(jié)果
code.png
03.深入
- a.關(guān)于serialVersionUID
/**
* 建議我們顯示設(shè)置serialVersionUID拳魁。因?yàn)槿绻宦暶鳎琂VM會自動為我們產(chǎn)生一個值撮弧,單這個值和編譯器的實(shí)現(xiàn)相關(guān)潘懊,并不穩(wěn)定。
* 這樣就可能在不同JVM環(huán)境下出現(xiàn)反序列化時報(bào)InvalidClassException異常贿衍。
*/
private static final long serialVersionUID = 5948291669509729179L;
- b.序列化實(shí)現(xiàn)原理
深入聊聊