2013-08-03 57 views

回答

1

因爲沒有實現Serializable的類仍然可以被ObjectOutputStream序列化。

這是不正確的。那會拋出一個NotSerializableException


原因writeObject()需要一個Object代替Serializable是,簽名來自實施其定義獨立系列化的接口ObjectOutput。但是,它會阻止ObjectOutputStream更改其簽名。

public interface ObjectOutput { 
    // ... 
    void writeObject(Object obj); 
} 
+0

所以它沒有任何意義? – MinecraftShamrock

2

因爲對象序列化比序列化的簡單實現更復雜的(想想代理:代理對象可以實現Serializable,但不是原來的對象,並在你的代碼中仍然使用原班)
另一種方式來實現系列化是外部化的界面讓你的對象序列化的完全控制或(從javadoc中):
類的序列化和反序列化 過程中需要進行特殊處理必須實現這些準確簽名的特殊方法:

private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException; 
private void writeObject(java.io.ObjectOutputStream stream) throws IOException 
private void readObjectNoData() throws ObjectStreamException; 

查看ObjectOutputStream javadoc瞭解關於序列化過程/機制的更多信息。

編輯:回答你的問題,瞬態只使用了序列化上下文,這樣一個不Serializable對象與瞬態場沒有意義

1

通常一個關鍵字如果超類實現Serializable它的子類是可序列化的這是唯一的情況,當你可以使字段瞬變和類不直接實現Serializable,但除了這個,如果類是不可序列化的,它是沒有意義的,使他們瞬態。

+1

在這種情況下,該類還通過繼承實現了Serializable。 –

2

由於多種原因,您可能仍希望將其標記爲瞬態。兩個立即想到的是:

  • 它可以幫助傳達該領域的語義目的。也就是說,它可以幫助任何讀你的代碼的人理解變量的意義是什麼

  • 第三方庫可能會使用關鍵字。例如,Google的Gson庫可以序列化/反序列化JSON中的任何對象,而不管它是否實現Serializable。在這種情況下,Gson將(默認)跳過標記爲瞬態的字段。