想要查看此教程的目錄請點擊:Java IO教程目錄貼地址
Java Serializable接口(java.io.Serializable),是一個標(biāo)記接口,你的類如果想被序列化與反序列化就必須要實現(xiàn)此接口。Java對象序列化用ObjectOutputStream實現(xiàn),反序列化(寫)由ObjectInputStream來完成。
Serializable是一個標(biāo)記接口并且內(nèi)部沒有方法。因此一個類實現(xiàn)這個接口后不需要去實現(xiàn)任何方法。實現(xiàn)這個接口只是告訴Java序列化類這個類是可以進(jìn)行對象序列化的。
Serializable例子
下面是關(guān)于實現(xiàn)Serializable接口的例子:
import java.io.Serializable;
public static class Person implements Serializable {
public String name = null;
public int age = 0;
}
如你所見,People類實現(xiàn)了Serializable接口,沒有實現(xiàn)任何該接口的方法。像之前提到的,Java Serializable接口只是一個標(biāo)記接口,不需要實現(xiàn)任何方法。
查看完整的例子可以去看 ObjectInputStream 或 ObjectOutputStream章節(jié)。
serialVersionUID
類除了實現(xiàn)這個接口以外,也要去定義一個私有的靜態(tài) long 類型的serialVersionUID變量。
下面是之前的那個Person類,添加了一個serialVersionUID變量:
import java.io.Serializable;
public static class Person implements Serializable {
private static final long serialVersionUID = 1234L;
public String name = null;
public int age = 0;
}
Java對象的相關(guān)序列化API用serialVersionUID來判斷反序列化的對象,在序列化的時候是否是被同一個版本的class序列化的(譯注:這個變量是uuid,所以不會有重復(fù)值),因為它現(xiàn)在正試圖去用這個類來反序列化。
假設(shè)一個Person對象被序列化到了磁盤,然后Person類有了一些改變。之后你嘗試去反序列化這個Person對象?,F(xiàn)在已經(jīng)序列化的Person對象可能已經(jīng)和最新版本的Person類不一樣了。
一個類實現(xiàn)了Serializable接口后可以提供一個serialVersionUID的靜態(tài)常量。如果這個類有比較大的改變,你同樣也可以重新生成serialVersionUID值。
譯者注:這里原文應(yīng)該沒有闡述清楚,上述的例子中,如果沒有serialVersionUID,并且反序列化時候類發(fā)生了變化比如增加了字段,那么會拋出異常,如果有這個serialVersionUID,即使增加字段,反序列化時候Java也會認(rèn)為這是同一對象,只不過新增加的字段會為null,因為被序列化的對象并沒有此字段。
JDK和一些Java開發(fā)工具都包含了一些生成serialVersionUID的辦法。
現(xiàn)在的對象Serialization
在現(xiàn)在(2015或更久以前),許多Java項目更多的使用不同的機(jī)制來序列化Java對象,而不是Java本身的序列化機(jī)制。例如,Java對象序列化到JSON,BSON或其他更優(yōu)的二進(jìn)制格式。這些有著非Java程序也可讀的優(yōu)點。例如,在web瀏覽器中運(yùn)行的JavaScript可以自然的序列化和反序列化對象和JSON。
順便說一下,這些其他的對象序列化直接一般不會需要你在Java類中去實現(xiàn)Serializable接口-它不會添加任何有用的信息。
更多關(guān)于Serialization的信息
對象的序列化本身就是一門學(xué)科。這個Java IO教程最多也就是關(guān)注一下stream或readers / writer。因此我不會在此來討論一些序列化的具體細(xì)節(jié)。另外,對于Java對象序列化的只是網(wǎng)上已經(jīng)有很多相關(guān)內(nèi)容了。我將不會重復(fù)它,而是給你一個關(guān)于這個學(xué)科更深層次的連接:http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html