この提案で@Brian Agnewの答えを補足したかった:
オブジェクトからわずかに異なる動作が必要な場合があったため、例で行ったように、匿名の内部クラスでその機能を拡張しました。外側のクラスは GUI アプリケーションであり、シリアライズ可能にしなかったのは、それが必要なかったからです。そのため、@Brian が言ったように、拡張しているクラスがあったとしても、匿名の内部クラスはシリアライズできませんでした。
この状況では、クラスが逆シリアル化されるときと再度シリアル化されるときの異なる動作を定義する必要があります。特定のコンストラクターを持つクラスがある場合は、クラスで次のようなメソッドを使用します。
public FunctionalObject getNewFunctionalObject (String param1, String param2) {
// Use an anonymous inner class to extend the behavior
return new FunctionalObject (param1, param2) {
{
// Initialization block code here
}
// Extended behavior goes here
};
}
したがって、デシリアライズするときは、次のように呼び出すことができます。
FunctionalObject fo = (FunctionalObject) objectInputStream.readObject ();
fo = getNewFunctionalObject(fo.getParam1(), fo.getParam2());
new
シリアル化するときは、古いオブジェクトのクローンであるオブジェクトを作成する必要があります。一部のクラスにはこの動作が組み込まれており、他のクラスでは明確に定義する必要があります。シリアル化の場合、それを複製できるコンストラクターがある場合、またはクラスにclone
メソッドが定義されている場合は、次のようにすることができます。
objectOutputStream.writeObject ( fo.clone() );
次に、clone
そのオブジェクトの は、匿名の内部クラスへの参照ではなく、シリアル化可能なオブジェクトの実際のコピーへの参照になります。
あなたの例の場合、これを行うことができました:
// Assuming objectOutputStream has already been defined
Map<String, String> params = new HashMap<String, String>() {{
put("param1", "value1");
put("param2", "value2");
}};
objectOutputStream.writeObject (new HashMap<String,String> (params));
これが機能するのは、クラスに渡されたもののHashMap
クローンを返すコンストラクターがあるためです。HashMap
簡単なことを言うには言葉が多すぎますが、もっと早くこのアドバイスがあればよかったのにと思います。