2013-05-18 67 views
3

可序列化是可繼承的。特別是如果我有可序列化可繼承

class A implements Serializable{} 

class B extends A{} 

B類是否可串行化?

+0

'B'不是可序列化的,它從超類繼承實現'Serializable'接口,在Java語義中的IMO。 – 0x90

+6

這在Java [docs](http://docs.oracle.com/javase/1.5.0/docs/api/java/io/Serializable.html)中明確提到,「*類的序列化是由實現java.io.Serializable接口的類沒有實現這個接口的類將不會有任何它們的狀態序列化或反序列化**可序列化類的所有子類本身都是可序列化的***「 – Lion

+3

@ 0x90 :擴展一個類或實現一個接口可以精確地定義一個*是* *的關係。所以是的,B *是一個* Serializable。 –

回答

2

是的。這源於Java中的繼承概念。由於A是可序列化的並且B擴展了A,因此B是序列化的。

請注意,A和B的所有非靜態非瞬態字段都必須包含Serializable對象,否則在嘗試序列化它們時會在運行時出現NotSerializableException。

0

是的,如果超類實現serializable,那麼子類也是如此。

0

如果一個類是可序列化,那麼所有子類序列化。但是如果你想阻止其超類Serializable的子類是可序列化的,那也是可能的。

如果你想防止再使用

NotSerializableException - 當實例需要具有序列化接口時拋出。序列化運行時或實例的類可能會引發此異常。爭論應該是類的名字。

請參考官方文檔 - http://docs.oracle.com/javase/6/docs/api/java/io/NotSerializableException.html

通過以這種方式使用它,你可以完成這個任務

private void writeObject(ObjectOutputStream out) throws IOException { 

    throw new NotSerializableException(「Not today!」); 
} 


private void readObject(ObjectInputStream in) throws IOException { 

    throw new NotSerializableException(「Not today!」); 

} 

如何子類是序列化,但父類是不

如果一個Sub類是可序列化的,那絕對不意味着它的超類也是可序列化的。當一個子類被反序列化時,超類的無參數構造函數將運行。

0

oracle tutorial

接口具有Java編程語言 另一個非常重要的作用。接口不是類層次結構的一部分,儘管 它們與類結合使用。 Java編程語言 不允許多重繼承(本課中稍後討論繼承 ),但接口提供了一種替代方法。

在Java中,一個類只能從一個類繼承,但它可以實現多個接口的 。因此,對象可以有多種類型: 它們自己的類的類型以及它們實現的所有接口的類型。這意味着如果一個變量被聲明爲接口的類型,它的值可以引用從實現該接口的任何類中實例化的任何對象 。在本課稍後部分討論的 中,標題爲「使用 接口作爲類型」的部分。

我想,如果你有一個函數foo它得到(Serializable ptr)你的意思是,你可以用Class B實例調用它因此,答案是肯定的,那就是思想。

此外,您可以重寫A(祖先)實現。

2

做了以下檢查給定的代碼

boolean b = new B() instanceof Serializable; 
System.out.println(b); 

返回true

+0

沒有必要執行代碼來回答這個問題。它涉及Java語言規範的屬性。 – EJP

+0

@EJP哦!但想要回答一些其他不同的方式。如果沒有意義,我會刪除。 – ajduke

0

通過基類實現的所有接口是由他們的派生類繼承。不只是可串行化。

0

我同意Serializable-ness是繼承的,但有問題(儘管很少),偶爾的工具無法識別該事實。所以即使這不是必需的,我還會額外努力將子類聲明爲實現Serializable。