2016-07-22 77 views
1

我的不可變類(最後所有字段)都包含對第三方類的對象的引用,該對象不會執行Serializable。通常的解決方法是(如How to serialize a non-serializable in Java?的接受答案中所述)使用writeObjectreadObject方法創建自定義序列化格式。但是,readObject無法更新final字段,因爲它不是構造函數。我見過使用readResolve來解決這個問題的suggestion,但是看不到如何工作,因爲我沒有看到如何獲得初始化最終字段到該方法所需的數據(它顯然只能訪問字段,我已經初始化了,而且我真的不想在對象被假定爲完全不可變的時候,在對象中創建一個新的可變字段用於臨時使用。)那麼我怎麼才能讓我的反序列化工作?如何序列化包含不可序列化對象的最終字段

public class ThisDoesntWork implements Serializable 
{ 
    private final transient SomeNonSerializableClass object; 
    private void writeObject (ObjectOutputStream out) throws IOException 
    { 
     out.writeUTF (object.toString()); 
    } 
    private void readObject (ObjectInputStream in) throws IOException 
    { 
     object = SomeNonSerializableClass.fromString(in.readUTF()); // error! 
    } 
} 
+0

您可以刪除'final'關鍵字。即使你刪除了它,你的類仍然是不可變的,因爲你控制了對該字段的所有訪問。這就是你封裝字段的原因。出於文檔目的,您可以將「final」作爲評論留下,例如'private/* final */MyObject myObj'。 – Andreas

回答

2

可以使用writeReplace()不同(代理)類的一個對象,和向readResolve()構建一個從在該代理的值的原始類的對象。構造函數可以設置最終字段。

相關問題