Java之序列化與反序列化

       Java序列化與反序列化是什麼?幹什麼用的等等這些問題真的困擾了我很久了,總是不理解爲什麼要序列化,又爲什麼要反序列化?在什麼情況下會用到Java的序列化和反序列化呢?直到今天學習了MapReduce,才深刻的理解了Java序列化和反序列話的作用及什麼情況下使用。

Java序列化與反序列化是幹什麼的?
       如果一個對象被序列化之後保存在文件中,可以通過反序列化將對象的類型信息,對象的數據及對象中的數據類型在內存中從新新建。通俗點理解就是,一個對象在一臺機器上被序列化保存在文件中,可以在另外一臺機器上通過反序列化從新新建這個對象。

使用序列化和反序列化的好處?
  1. 實現了數據的持久化,通過序列化將數據永久的保存在文件中或數據庫中。
  2. 利用序列化實現遠程通信,即在網絡上傳送對象的字節序列。簡單點說,就是發送方把需要發送的對象轉換爲字節序列,然後在網絡上傳輸。接收方需要從字節序列中恢復出Java對象。
如何實現Java序列化與反序列化呢?
  • java.io.ObjectOutputStream:表示對象輸出流
          它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的字節序列寫到一個目標輸出流中。
  • java.io.ObjectInputStream:表示對象輸入流
          它的readObject()方法源輸入流中讀取字節序列,再把它們反序列化成爲一個對象,並將其返回。

實現序列化的要求?
       只有實現了Serializable了接口的類的對象才能被序列化,否則拋出NotSerializableException異常。
案例:
  • User類:
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模式中很是有用;二是可以對象數據的遠程通信。
  • 繼續鞏固基礎。↖(^ω^)↗!!!

發佈了62 篇原創文章 · 獲贊 43 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章