2011-09-19 23 views
1

我知道它只是保存了一個對象的狀態,但是我應該在哪些類中實現此接口?我不確定我是否理解java中可序列化的工作原理

例如,假設有4類A,B,C,d:

abstract class A { ... } 
class B extends A { ... } 
class C extends A { ... } 

D是其中的AB的對象的創建和操縱的類:

class D { A a; B b; ... } 

如果我想存儲程序的狀態,我應該說只在D和A類中實現Serializable接口嗎?

另外,假設有class E這只是用於幫助D一些計算。

應該E也執行Serializable?它對我來說似乎並不正確,因爲它只是一個有助於計算的類,它不會存儲任何需要在稍後狀態中知道的值。

回答

1

只能序列化保存你需要找回的數據的東西。在這種情況下,A似乎是可能的候選人。

我不會序列化D,因爲它只是一個持久對象的集合......我將允許一個方法讓我檢索A及其子元素(getData())的所有實例或數組,我存儲一切。然後另一種方法可以讓我用A數組重建D。

此外,由於E不包含任何數據,因此不需要序列化(不需要任何需要保留的運行時數據)。

B和C將繼承A.

序列化問問你自己,如果我重新啓動我的應用程序,我想,當我打開它有什麼樣的數據。儘量讓序列化的對象儘可能輕量級,並且讓你的生活更輕鬆。

-1

你打算序列化的每個對象都應該實現Serializable接口。在你的A和D類中需要實現它。你不需要序列化E,因爲它沒有任何狀態。

在通常情況下,所有持有狀態的類(粗略地說,任何實例級變量)都應該直接或間接地實現Serializable(如果它們要被序列化)。

+0

downvote的任何理由? – Santosh

+0

我的理由是,我不同意你的看法,你不應該序列化E(我猜你的意思不應該,否則這不會是一個有建設性的答案......你也不需要序列化C或D ,但你)...無論如何,檢查我的答案。 –

+0

@ Luchian,但E沒有任何狀態數據(Daryl Teo也指出)爲什麼要序列化它? OP提到的實用類。 – Santosh

0

序列化的想法是,您想要稍後或在不同的機器上重新創建實例。也許這有助於思考什麼我們需要重新創建,什麼可以在本地創建。

abstract class A implements Serializable { private int a; } 
abstract class B extends A { private int b; B(int b) { this.b=b;} } 
abstract class C extends A { private int c; C(int c) { this.c=c;} } 

這允許序列化的B /反序列化實例和C.

class D implements Serializable { 
    B someB; 
    C someC; 
    D(int b, int c) { 
    someB = new B(b); 
    someC = new C(c); 
    } 
} 

在這種情況下d具有序列化的,因爲我們希望具有完全相同的B和C的對象一個d實例。

如果E只是提供了一些方法,那麼我們可能就不需要序列化 ​​- 除非D引用的E一個實例,我們需要它來重新創建一個有效的D實例。

相關問題