Archive for 2010/6/25
Javaを使ってAMFからJavaのオブジェクトにするときに、Classがみつからないとはまった。
というのも、今まではAMF3Inputも、見つけたいクラスも同じクラスローダー上であったので、
SerializationContext ctx = SerializationContext.getSerializationContext(); Amf3Input input = new Amf3Input(ctx); input.setInputStream(bais); Object ret = input.readObject();
とすれば、なんの問題もなかった。
しかし、readObjectをする前にどうしてもオブジェクトのクラスローダーを指定する必要がでてきたのだ。
これは、たとえばユーザが作ったjarを個別に読込(別のClassLoaderで)、
そのjarの中からオブジェクトを作成するときなんかには必要になるのだが。。
でもって、Amf3InputでClassLoaderを指定するには・・・・
以下の方法でできた。(これで正しいのはわからない。。。)
// 現在動いているスレッドのClassLoaderを取得 // ここで目的のClassLoaderを作れば、それで自分好みのClassLoaderを指定できる。 ClassLoader loader = Thread.currentThread().getContextClassLoader(); SerializationContext ctx = SerializationContext.getSerializationContext(); // ここでClassLoaderを指定する。 // ただし、次のおまじないも必要 TypeMarshallingContext.getTypeMarshallingContext().setClassLoader(loader); // ここで、Message.classのインスタンスは別の方法を使って作ってね。という指示。 // こうすることで、どうやら上で指定したClassLoaderを使う。 // この指定が無いと、ClassLoaderを使ってくれない。 // ここではまった!? // ただ、BeanProxyで本当にいいかわからないが・・今のところ問題はない。 PropertyProxyRegistry.getRegistry().register(Message.class, new BeanProxy()); Amf3Input input = new Amf3Input(ctx); input.setInputStream(bais); Object ret = input.readObject();
とこのようになるらしい。
AMF3Inputのソースを調べていったらそうだった。というメモ書き。


