1
我的不可變類(最後所有字段)都包含對第三方類的對象的引用,該對象不會執行Serializable
。通常的解決方法是(如How to serialize a non-serializable in Java?的接受答案中所述)使用writeObject
和readObject
方法創建自定義序列化格式。但是,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!
}
}
您可以刪除'final'關鍵字。即使你刪除了它,你的類仍然是不可變的,因爲你控制了對該字段的所有訪問。這就是你封裝字段的原因。出於文檔目的,您可以將「final」作爲評論留下,例如'private/* final */MyObject myObj'。 – Andreas