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のソースを調べていったらそうだった。というメモ書き。

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2010年6月
« 5月   7月 »
 123456
78910111213
14151617181920
21222324252627
282930  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ