0

Flex から Java に int を戻すときに問題が発生します。問題の int は ID であり、物事が壊れ始めたため、今朝はしきい値に達したようです。

flex で 922927950 を blaze を介して Java に渡しています。Javaが取得するまでに、9.2292795E8に変換されています

フレックスの私のコードは

service.getRemoteObject().sendData(objectIds);

ここで、オブジェクト ID は ArrayCollection です。これで、デバッグして番号が 922927950 であることを確認できます。次に、Java をデバッグして、9.2292795E8 に変換されたことを確認できます。

sendData には次の署名があります

public void sendData(List<Integer> objectIds) {...}

flex objectids 配列を int ではなく数値を含むように変更しようとしましたが、これも機能しません。9.2292795E8 を保存することがわかっている限り、Java では数値は float でなければなりません。フロートはJavaの整数内に収まるので、型の不一致エラーが発生しないのはそのためだと思います。問題は、ID が科学表記法になり、それらを使用する jpa クエリが壊れることです。

数値が科学表記法に変換される理由を知っている人はいますか?

ありがとう

アップデート

さらに調査すると、さらに奇妙になります。Javaで次のコードを試しました

public void sendData(List<Integer> objectIds) {
    List<Integer> converted = new ArrayList<Integer>();

    for (Integer objectId : objectIds) {
        converted.add(objectId);
    }
    ...
}

convert.add(objectId) 行で double を integer に変換できないというクラス キャスト例外が発生するようになりました。

 java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer

これは、Flex で 922927950 を Number にキャストしたときに発生し、Double にマップすると推測されます。ここで私の問題は、Java 側でジェネリックを使用していて、BlazeDs がこれらを考慮しないため、ジェネリックなしで署名に一致するだけですか?

4

2 に答える 2

1

まず、Amf3Types のドキュメントを見てください。

AMF 3 経由で送信されたときに ActionScript Number への昇格を回避する int の最大値は 2^28 - 1、つまり 0x0FFFFFFF です。

これは 10 進表記で 268,435,455 であり、922,927,950 はこの制限をはるかに超えています。これはシリアル化の問題であることに注意してください。int データ型は、通常の 32 ビット int 型と同様に 2^31 - 1 の値を保持できます。

ここで、コードでこれを試してください。

public void sendData(List<?> objectIds) {
    List<Integer> converted = new ArrayList<Integer>();

    for (Object objectId : objectIds) {
        converted.add(((Number)objectId).intValue());
    }
    ...
}

型変換と高度な数値型をより適切に制御する必要がある場合は、BlazeDS の代わりにGraniteDSの使用を検討する必要があります。こちらこちらのドキュメントを参照してください。

よろしく、フランク。

于 2012-08-31T13:56:51.657 に答える
0

@Franck Wolff が説明したように、値がメモリに保存される方法の技術的な理由により、Flex と BlazeDS の間で転送するときだけでなく、数値全般を使用すると、大きな数値を使用するとあらゆる種類の問題が発生します。

これらの数値を計算に使用していないように見えるので、ここの値よりも正しい順序が重要であると思います.

ID を文字列に変換し、転送しInteger.valueOf( String )てから、数値に戻すために使用します。これは、反対側で何を得ているのかを本当に確実に知る唯一の方法です。もちろん、独自のシリアライゼーション クラスを作成する場合を除きます。

于 2012-08-31T18:11:36.513 に答える