2014-01-06 53 views
4

所以我知道我最終可以弄清楚,但我無法真正找到答案這個看似簡單的問題的主題。序列化Java:哪些類需要「實現Serializable」?

我序列化一組對象的向量,每個這樣的對象屬於一個用戶定義的類。我知道載體是可序列化的。我是否也必須使用戶定義的類實現可序列化?而且,這些用戶定義的類中的每一個都包含其他用戶定義的類。那些必須被標記爲實現Serializable嗎? (等等,或者只是頂級類需要實現Serializable)? (注意,arrayLists應該用來代替矢量,之前我聽說過,我正在練習,因爲我聽說矢量對於多線程是有好處的,我發現了討論類似的東西的主題,但不是精確的)。

由於

+0

實際上,將載體或多或少已過時。如果你想要一個線程安全的List,'Collections.synchronizedList'更好。或者只是在列表中手動同步,因爲無論如何您都可能需要這樣做以避免寫入競爭條件。 – yshavit

+0

好吧,謝謝,很高興知道。我第一次學習C++,因此我使用了矢量。在C++中,矢量也被棄用了嗎? – squirrelsareduck

+0

自20世紀以來,我沒有寫過C++,對不起。 :) – yshavit

回答

5

是的,你是正確的:凡是正在連載,包括字段(實例變量)中提到的所有類,必須實現Serializable領域必須transient

對於您的情況,用戶定義的類必須實現Serializable,並且其字段類型爲Serializable。這適用於遞歸,因此字段類的字段也必須是Serializable等。

transient關鍵字指示序列化機制忽略用於序列化的字段。

1

Serializable文檔:

當遍歷的曲線圖,一個對象可能會遇到不支持Serializable接口。在這種情況下,NotSerializableException將被拋出,並將標識不可序列化的對象的類。

所以,是的,通過矢量引用,直接和間接的所有對象,將需要Serializable,當然,除非他們標記爲transient

+0

謝謝。得到我的程序工作 – squirrelsareduck

1

理論上可以實現自定義序列化的自定義矢量和序列化非序列化對象,喜歡這裏

class Y { 
    int y; 
    Y(int y) { 
     this.y = y; 
    } 
} 

class X implements Serializable { 
    transient Y y; 

    private void writeObject(ObjectOutputStream os) throws IOException { 
     os.defaultWriteObject(); 
     os.writeInt(y.y); 
    } 

    private void readObject(ObjectInputStream is) throws ClassNotFoundException, IOException { 
     is.defaultReadObject(); 
     y = new Y(is.readInt()); 
    } 
... 
+0

謝謝。讓我的程序工作 – squirrelsareduck

相關問題