2011-10-27 6 views
3

こんにちは私は変更できないいくつかの与えられたインターフェイスを拡張するクラスを持っています。これらのインターフェイスはExternalizableを実装しています。しかし、私は定期的なJavaのシリアル化を使用して私のオブジェクトをシリアル化したい。ExternalizableをSerializableに上書きする方法は?

基本的に私は、シリアル化Externalizableを無視して、これを行うにはSerializableだけ

どれかの方法を使用したいですか?

答えて

1

はい、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を実装するようにクラスを作成します。しかし、私は個人的に最初の方法がより好きです。

+0

「writeOrdinaryObject」はリフレクションによって呼び出されるはずですか?それとも、ハックですか? –