Java對象序列化

最近在深入學習一些框架,其中有一部分的工作原理就是對象的序列化和反序列化。下面簡單介紹一下什麼是序列化。
Java平臺允許我們在內存中創建可複用的Java對象,但一般情況下,只有當JVM處於運行時,這些對象纔可能存在,這些對象的生命週期不會比JVM的生命週期更長。
但在現實應用中,就可能要求在JVM停止運行之後能夠保存(持久化)指定的對象,並在將來重新讀取被保存的對象。Java對象序列化就能夠幫助我們實現該功能。
使用Java對象序列化,在保存對象時,會把其狀態保存爲一組字節,在未來,再將這些字節組裝成對象。必須注意地是,對象序列化保存的是對象的”狀態”,即它的成員變量。由此可知,對象序列化不會關注類中的靜態變量。
除了在持久化對象時會用到對象序列化之外,當使用RMI(遠程方法調用),或在網絡中傳遞對象時,都會用到對象序列化。

下面舉個例子:
首先寫一個枚舉類 ,枚舉大家都知道是可以被實例化的,和實現了serializable接口的實體類,重寫實體類的tostring()方法。

public enum Classes {
    ONE,TWO,THREE
}
import java.io.Serializable;

public class Student implements Serializable{
    private String name;
    private Classes classes;
    private int age;

    public Student(String name, Classes classes, int age) {
        this.name = name;
        this.classes = classes;
        this.age = age;
    }

    @Override
    public String toString() {
        return "[" + name + "," +
                 classes + "," +
               age +
                "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Classes getClasses() {
        return classes;
    }

    public void setClasses(Classes classes) {
        this.classes = classes;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

輸出結果爲

[asd,ONE,23]

這裏用到了對象流,通過源碼可知如果被寫對象類型是數組,enum,String,以及實現了Serializable接口,就可以實例化,否則拋出NoSerializableException異常。
注意:
1.當某個字段被聲明爲transient時該字段不會被序列化。
2.使用序列化接口Externalizable,之前基於Serializable接口的序列化機制將會失效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章