Java序列化與反序列化是什麼?幹什麼用的等等這些問題真的困擾了我很久了,總是不理解爲什麼要序列化,又爲什麼要反序列化?在什麼情況下會用到Java的序列化和反序列化呢?直到今天學習了MapReduce,才深刻的理解了Java序列化和反序列話的作用及什麼情況下使用。
Java序列化與反序列化是幹什麼的?
如果一個對象被序列化之後保存在文件中,可以通過反序列化將對象的類型信息,對象的數據及對象中的數據類型在內存中從新新建。通俗點理解就是,一個對象在一臺機器上被序列化保存在文件中,可以在另外一臺機器上通過反序列化從新新建這個對象。
使用序列化和反序列化的好處?
- 實現了數據的持久化,通過序列化將數據永久的保存在文件中或數據庫中。
- 利用序列化實現遠程通信,即在網絡上傳送對象的字節序列。簡單點說,就是發送方把需要發送的對象轉換爲字節序列,然後在網絡上傳輸。接收方需要從字節序列中恢復出Java對象。
如何實現Java序列化與反序列化呢?
- java.io.ObjectOutputStream:表示對象輸出流
它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
- java.io.ObjectInputStream:表示對象輸入流
它的readObject()方法源輸入流中讀取字節序列,再把它們反序列化成爲一個對象,並將其返回。
實現序列化的要求?
只有實現了Serializable了接口的類的對象才能被序列化,否則拋出NotSerializableException異常。
案例:
public class User implements Serializable {
private String username;
private int age;
public User() {
}
public User(String username, int age) {
this.username = username;
this.age = age;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
'}';
}
}
@Test
public void out(){
User user = new User("張三",18);
File file = new File("d://out.txt");
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
objectOutputStream.writeObject(user);
objectOutputStream.flush();
objectOutputStream.close();
fileOutputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
結果:
@Test
public void input(){
File file = new File("d://out.txt");
try {
FileInputStream inputStream = new FileInputStream(file);
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
User user = (User) objectInputStream.readObject();
System.out.println(user);
objectInputStream.close();
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
結果:
總結:
- Java序列化就是把對象轉換成字節序列,而Java反序列化就是把字節序列還原成Java對象。
- 採用Java序列化與反序列化技術,一是可以實現數據的持久化,在MVC模式中很是有用;二是可以對象數據的遠程通信。
- 繼續鞏固基礎。↖(^ω^)↗!!!