2016-07-22 22 views
1

私の不変クラス(すべてのフィールドが最後)には、Serializableを実装していないサードパーティクラスのオブジェクトへの参照が含まれています。このための通常の回避策は、(How to serialize a non-serializable in Java?の受け入れ回答に記載されているように)writeObjectおよびreadObjectメソッドを使用してカスタムシリアル化形式を作成することです。ただし、readObjectはコンストラクタではないためfinalフィールドを更新できません。私はreadResolveを使用してsuggestionを見てきましたが、これを回避する方法はわかりません。最終的なフィールドをそのメソッドに初期化するために必要なデータを取得する方法がわかりません。フィールドは私が既に初期化しているので、オブジェクトが完全に不変であると想定されているときに、逆直列化中の一時的な使用のために、オブジェクト内に新しい可変フィールドを作成しないでください。だから私はどのように私のdeserializationを働かせることができますか?プロキシの値から元のクラスのオブジェクトを異なる(プロキシ)クラスのオブジェクトを書き込み、readResolve()に構築するwriteReplace()を使用シリアル化できないオブジェクトを含む最終フィールドをシリアル化する方法

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

。コンストラクタは最終フィールドを設定できます。

関連する問題