2004年02月15日
Flash, Java | OpenAMF 1.0 RC5 改
Flashからの引数がなぜかdoubleで処理されています。メソッドに定義されている型に合わせて、勝手にメソッドをInvokeするはずなので、ここは引数に宣言されているintで処理されると思いきや、doubleで処理されています。 なのでエラーが発生し、戻り値が正常に受け取れませんでした。 とりあえずintで宣言している引数を両方ともdoubleにした所Flash側で戻り値が受け取れました。この問題、僕のところでもずっと前から起こっていて、開発者にバグ報告もしたのだけど、今のところまだ対処はされていない。
回避策として、サービスオブジェクト(Java側)のメソッドにはdoSomthing(int)とdoSomething(Double)を用意し、
doSomething(Double num) {
doSomething(num.intValue());
}と、わざわざint値に変換していました。まぁ大した手間ではないのでこれでもよかったんだけど、いい加減うざくなったので、ソースにちょこっと手を加え、パラメータにint、long、Integer、Longが要求される場合、OpenAMFで変換できるようにしてみました。かなり無理やりだけど。
上のコード例のように引数がDoubleのもの、intのもの両方が定義されている場合、Doubleが優先されます。この使い分けは、同じサービスメソッド内容でFlashから呼び出す時だけ、ある処理を追加したいって時に役立ちます。
この問題点の箇所は、org.openamf.util.OpenAMFUtilsにあります。ソースをいじってしまったので、正確な行数がわからなくなってしまいましたが、50行目付近に
decodedObject = translator.fromActionScript(parameter);というコードがあります。translatorインスタンスのクラスはASTranslatorです。
ASTranslator.fromActionScript(Object asObject)では、
Class desiredBeanClass =となっており、さらにDecoderFactory.decideClassToTranslateInto(Object asObject)では、asObjectがASObjectクラスのインスタンスでない場合、つまりDouble型などのネイティブ型の場合、
DecoderFactory.decideClassToTranslateInto( asObject );
return fromActionScript( asObject, desiredBeanClass );
asObject.getClass()で取得されたクラスに変換されます。だから、fromActionScript()メソッドにDouble型オブジェクトが渡されれば、Doubleのオブジェクトそのままで返されてしまいます。
ASTranslator.fromActionScript(Object asObject, Class desiredBeanClass)はprotectedなので、OpenAMFからは呼べません。このメソッドをpublicにして、OpenAMF側もこれに合わせて・・・って手もありますが、それよりは今回改造したようにOpenAMF内でDouble→求められる数値型への変換を行ってしまう方が手っ取り早いと思います。
Comment
別の解決策としてRC2のデコード部分とRC5のデコード部分をマージしたらとりあえず動くようになりました(^_^)
Posted by: hoso : 2004年02月16日 01:30
Wow, so cool!
Posted by: otsuka : 2004年02月16日 01:48