過去の日記

2006-10-20 [長年日記]

ダミア〜ン [etc]

Download free Halloween music and spooky sounds

Free Halloween Music だそうで。でもなんでダミアン?

ObjectInputStreamでカスタムクラスローダを使う [java][tech]

なんとかObjectInputStream#readObject()のときに、カスタムクラスローダを使えないか調べていたところ、ObjectInputStreamをサブクラス化して、

Class> ObjectInputStream#resolveClass(ObjectStreamClass)

をオーバーライドしてやれば良いらしい。

Onion開発日記(2006-10-19)

そんな手があったんだ。


ObjectInputStream#readObject()はデフォルトでは、system classloaderを使ってクラスをロードしているようなのだが、

Onion開発日記(2006-10-19)

とあるけど、「system classloaderを使」うんじゃなくて、実行スタックを遡っていって*1一番近い「null でない ClassLoader」を使うというのが正しい(ハズ)。
↓しかしこの説明分かりにくすぎ。

ここで loader は、実行スタックまでの最初の null でないクラス、または null でないクラスローダがスタック側 (resolveClass メソッドが使用する同じクラスローダの選択) にない場合は null です。
ObjectInputStream (Java 2 プラットフォーム SE v1.4.0)


私はというと、カスタムクラスローダでロードする class ではない方に

public class Foo {
  public static interface ObjectLoader {
    public Object readObject(ObjectInputStream in) throws IOException, ClassNotFoundException;
  }

  public static Object loadObject(ObjectLoader o, ObjectInputStream in) throws IOException, ClassNotFoundException {
      return o.readObject(in);
    }
  }
}

なんてのを書いて、カスタムクラスローダでロードする class の方を interface ObjectLoader の実装にしておいてそれを引数で渡す。

public class Bar implements Foo.ObjectLoader
  public Object readObject(java.io.ObjectInputStream in)
      throws java.io.IOException, ClassNotFoundException {
    return in.readObject();
  }
  
  public void do() {
    :
    :
    
    Object o = Foo.loadObject(this, in); //※
    
    :
    :
  }
}

抜粋するとこんな感じかな(これでコンパイル通るのか?)。


追記
これだと例になってないや。
こんな面倒な仕掛けをする必要が無いところ(※)でデシリアライズしてるもんなぁ。

舞-乙HiME 1 2 [anime]

舞-乙HiME 1 [DVD]

  • 監督: 小原正和
  • 出演: 菊地美香,小清水亜美,ゆかな,千葉紗子,進藤尚美
  • 出版社/メーカー: バンダイビジュアル
  • ASIN: B000BVARHE
  • 発売: 2006-01-27
  • amazon.co.jp詳細へ


舞-乙HiME 2 [DVD]

  • 監督: 小原正和
  • 出演: 菊地美香,小清水亜美,ゆかな,千葉紗子,進藤尚美
  • 出版社/メーカー: バンダイビジュアル
  • ASIN: B000COQ602
  • 発売: 2006-02-24
  • amazon.co.jp詳細へ

「次は4話か、胸騒ぎがする」に爆笑。

*1 実行スタックはわざと例外を起こして Exception#printStackTrace() を見ると確認できる。