こんにちは私は変更できないいくつかの与えられたインターフェイスを拡張するクラスを持っています。これらのインターフェイスはExternalizable
を実装しています。しかし、私は定期的なJavaのシリアル化を使用して私のオブジェクトをシリアル化したい。ExternalizableをSerializableに上書きする方法は?
基本的に私は、シリアル化Externalizable
を無視して、これを行うにはSerializable
だけ
どれかの方法を使用したいですか?
こんにちは私は変更できないいくつかの与えられたインターフェイスを拡張するクラスを持っています。これらのインターフェイスはExternalizable
を実装しています。しかし、私は定期的なJavaのシリアル化を使用して私のオブジェクトをシリアル化したい。ExternalizableをSerializableに上書きする方法は?
基本的に私は、シリアル化Externalizable
を無視して、これを行うにはSerializable
だけ
どれかの方法を使用したいですか?
はい、OutputStreamの作成を制御することができます。
通常、私たちはObjectOutputStream.writeObject()
を使用して、直列化可能オブジェクトを書き込みます。このメソッドはフラグ 'enableOverride'をチェックします。フラグが真の場合、サブクラスObjectOutputStream
によってオーバーライドできるメソッドwriteObjectOverride()
が呼び出されます。
解決策は次のとおりです。あなたは、彼らがプライベートであるため、(setAccessible(true)
を呼び出すことを忘れないでください)リフレクションを使用して、基本クラスのいくつかのメソッドを呼び出す必要がありますコメントから見ることができるように
protected void writeObjectOverride(Object obj) throws IOException {
if (isMySpecialClass(obj.getClass())) {
// call writeOrdinaryObject(obj, desc, unshared); using reflection because this method is private
return;
}
// fall back to regular mechanism.
}
次のようwriteObjectOverride()
を実装ObjectOutputStream
のサブクラスを作成します。しかし、それは可能です。私は、この仕事は数時間で済むと信じています。
幸運。
さらに別の解決策は、バイトコードの変更を使用しています。さまざまなライブラリを使用してオンザフライでバイトコードを変更できるので、Externalizable
の代わりにSerializable
を実装するようにクラスを作成します。しかし、私は個人的に最初の方法がより好きです。
「writeOrdinaryObject」はリフレクションによって呼び出されるはずですか?それとも、ハックですか? –