2009-05-18 81 views
8

如果一個類似的問題已經發布在stackoverflow上,請發佈鏈接。爲什麼它需要將類標記爲可序列化?

對需要序列化的對象實現Serializable接口(無方法)需要什麼? Java API說 - - 如果未實現,則會拋出java.io.NotSerializableException。

這是因爲在ObjectOutputStream.java

............................ 

writeObject0(Object obj, boolean unshared){ 
............. 
} else if (cl.isArray()) { 
     writeArray(obj, desc, unshared); 
     } else if (obj instanceof Serializable) { 
     writeOrdinaryObject(obj, desc, unshared); 
     } else { 
     throw new NotSerializableException(cl.getName()); 
     } 
................ 

下面的代碼,但我的問題是,爲什麼它要實現Serializable,從而通知或告知的Java/JVM一個類可以被序列化。 (只是爲了避免這種例外嗎?)。

在這種情況下,如果我們編寫一個類似的功能,將對象寫入流而不檢查類是否在一個instanceOf Serializable中,類的對象是否會實現Serializable序列化?

任何幫助表示讚賞。

+3

Dupe of http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface – 2009-05-18 15:03:31

+0

[This question](http://stackoverflow.com/questions/441196/why-java-needs- serializable-interface)對此有一些很好的答案。 – jwoolard 2009-05-18 14:47:58

回答

4

這是一個很好的問題。 Serializable被認爲是marker interface,並且可以被看作是類中的標籤,以將其標識爲具有功能或行爲。例如你可以使用它來標識你想要序列化的沒有定義serialVersionUid的類(這可能是一個錯誤)。

請注意,常用的序列化庫XStream(和其他)不需要定義Serializable。

2

這是需要的,以便JVM可以知道類是否可以安全地序列化。有些東西(例如數據庫連接)包含無法真正序列化的狀態或連接到外部資源。

而且,你要確保你把一個serialVersionUID的成員在每一個序列化類,以確保代碼更改後的序列化對象可以反序列化或重新編譯:

// Set to some arbitrary number. 
// Change if the definition/structure of the class changes. 
private static final long serialVersionUID = 1; 
0

的原因是並不是所有的類都可以被序列化。示例:

  • I/O stuff:InputStream,HTTP connections,channels。它們依賴於在Java VM範圍之外創建的對象,並且沒有簡單的方法來恢復它們。

  • OS的資源,如窗口,圖像等

2

序列化可以讓你直接保存對象的二進制文件,而無需解析成文本,寫出來的字符串,然後創建一個新的對象,並在重新讀入時解析字符串輸入。主要目的是讓您將所有數據的對象保存到二進制文件中。當我不得不使用包含大量相同類型對象的鏈表時,我發現它非常有用,我需要保存並打開它們。

相關問題