2012-07-22 131 views
31

可能重複:
Why Java needs Serializable interface?爲什麼Java.lang.Object沒有實現Serializable接口?

據串行化的Java文檔:

類的串行化是通過實現 java.io.Serializable接口的類啓用接口。沒有實現這個接口的類將沒有任何狀態序列化或反序列化。 可序列化類的所有子類本身都是可序列化的。該 序列化接口沒有方法或字段,僅用於 確定的可序列化

爲什麼沒有對象已經實現了Serializable語義?我們不想被序列化的成員可能會被製作爲transient。爲什麼要防止默認的Serializability?

+2

[這個問題](http://stackoverflow.com/questions/441196/why-java-needs-serializable-interface)包含可能感興趣的你一些不錯的答案。 – Pshemo 2012-07-22 12:24:58

+0

確實。我應該在發佈之前嘗試過其他關鍵字:) – 2012-07-22 12:36:38

回答

40

序列化類的所有子類型本身可序列化。

換句話說:你曾經創建所有類,已經或將要創建都是序列化的。 transient只排除字段,不排除整個類。

這是一個潛在的安全漏洞 - 巧合,你可以如序列化您DataSource裏面數據庫憑證 - 如果這個特殊DataSource實現的創作者忘了做出這樣的領域transient。序列化隨機Java對象,例如通過內部類別持有對外部this的隱式引用。

這只是使用更安全的其中要明確的類白名單,並允許序列化,而不是仔細檢查你的代碼,確保不,你不希望字段是有史以來連載。

此外,你不能再說:MySuperSecretClass是不可序列化的(通過簡單地不執行Serializable) - 你只能排除膽量(字段)。

+0

OKay,我想我完全錯過了它的安全性。說得通。但是,我們不使用Private/Public/Protected來進行編譯時訪問嗎?難道暫時的或者類似的事情不能成爲運行時間的授權嗎?只是問問。或者它會很麻煩。 – 2012-07-22 12:28:07

+3

@ TJ-:恕我直言,只有一小部分類需要可序列化(值對象,DTO)。標記需要可序列化的類比標記那些不需要的類要方便得多。並不是說Java在這方面不麻煩:恕我直言,所有的字段都應該是私有的,所有的方法默認都是公共的,但是你能做什麼? – 2012-07-22 12:30:36

5

大多數類並不需要可序列化。使用當前設計,您可以輕鬆注意到該類是可序列化的。基本上它只是一個編譯器檢查的自我文檔。否則,你可能會寫一些類似的東西:

/** DON'T SERIALIZE IT!!! */ 
class Connection { ... } 

並且最好有語言或庫功能比評論。

1

我認爲對於需要堅持的對象實施Serializable更有意義,並且宣佈類transiennt的每個字段將更加麻煩。我不確定的另一點是Object是所有類的根,它包括與反射有關的類,所以對Object類實現Serializable是不合適的。

13

1。Serializable標記接口,裏面是空的,但是當一個類被標記序列化,這意味着它的對象是可序列。

2. java.lang.Object沒有實現Serializable的原因是,如果你不想將某些字段設置爲Serializable,而你錯過了將錯誤添加到該字段,那麼將是一個破壞。

通過使程序員實現Serializable他的課,這讓他有意識地實現了它,並應採取必要步驟,以防止任何被序列化這不應該是程序員之間的認識。

相關問題