私の不変クラス(すべてのフィールドが最後)には、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!
}
}
あなたは 'final'キーワードを削除できます。フィールドへのすべてのアクセスを制御するため、クラスを削除してもクラスは変更できません。そのため、フィールドをカプセル化します。ドキュメンテーションの目的で、「final」をコメントとして残すことができます。 'private/* final */MyObject myObj'を呼び出します。 – Andreas