2010-10-27 57 views
4

當我序列化抽象類時,繼承子類是否也會被序列化? 這是否包括抽象類及其子類的成員?Java序列化問題

public abstract class RootClass implements Serializable{ 
Object data; 
} 

public class SubClassA extends RootClass{ 
Object dataA; 
} 

public class SubClassB extends RootClass{ 
Object dataB; 
} 

現在,當我實例化類SubClassA和SubClassB,我將序列化這些實例是可能的?

它會包含子類和根類的成員嗎?

回答

8

不知道我是否理解這個問題。無論如何,我會盡力回答。

當你聲明一個抽象類Serializable時,這個接口也被子類繼承,所以它們被認爲是可序列化的,並且也必須被序列化(如果你什麼也不做,默認的序列化機制將被應用到它,可能會或可能不會工作)。

您只能序列化對象實例,而不是類。

默認序列化序列化父類的字段,但只有當該父類也是可序列化的。如果不是,父狀態不是序列化的。

如果序列化抽象類的子類的對象,並且抽象類是Serializable,那麼抽象父類中的所有字段也將被序列化(通常的例外適用,例如瞬態或靜態字段)。

+0

謝謝!這是我一直在尋找的答案。 – 2010-10-27 05:02:30

0

序列化是爲了'對象'並保存它們的狀態而不是類。由於您不能爲抽象類創建實例,因此討論它們是否可以序列化是沒有意義的。

+1

我想你沒有得到這個問題,我會發布代碼。感謝你的回答。 – 2010-10-27 04:56:21

+0

@Richeve:是的請 – bragboy 2010-10-27 04:57:21

0

當您實例化某個類的對象時,其數據由兩部分組成:由其類定義的字段和由超類定義的字段。請注意,並非所有繼承字段都可訪問,只有那些定義爲protectedpublic(或在同一包中未修改)的字段纔可訪問。

如果對象的類是Serializable,則其字段將被序列化(除非標記爲transient),並且繼承字段的情況也是如此。在你的情況下,SubClassA的一個實例將包含'data'和'dataA',並且因爲類和子類都是Serializable,所以這兩個字段都將被序列化。反序列化後,這兩個字段都應該可以訪問。