0

将 int 从 flex 传递回 java 时遇到问题。有问题的 int 是一个 ID,今天早上我似乎已经达到了一个阈值,因为事情开始崩溃了。

我通过 blaze 将 922927950 传回给 java。到 java 获取时,它已转换为 9.2292795E8

我在 flex 中的代码是

service.getRemoteObject().sendData(objectIds);

其中对象 ids 是一个 ArrayCollection。在这个我可以调试,看到数字是922927950。然后我可以调试java,看到它已经转换为9.2292795E8

sendData 具有以下签名

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

我尝试将 flex objectids 数组更改为包含数字而不是整数,但这也不起作用。据我所知,在 java 中存储 9.2292795E8 的数字必须是浮点数。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

这是十进制表示的 268,435,455,而 922,927,950 远远超过了这个限制。请注意,这是一个序列化问题:int 数据类型能够保存 2^31 - 1 的值,就像常规的 32 位 int 类型一样。

现在,你应该用你的代码试试这个:

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

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

如果您需要更好地控制类型转换和高级数值类型,您应该考虑使用GraniteDS而不是 BlazeDS。请参阅此处此处的文档。

问候,弗兰克。

于 2012-08-31T13:56:51.657 回答
0

正如@Franck Wolff 解释的那样,由于值如何存储在内存中的技术原因,在使用大数字时会遇到各种麻烦 - 不仅在 Flex 和 BlazeDS 之间传输时,而且在一般情况下使用数值。

由于您似乎没有将这些数字用于任何计算,因此我认为正确的顺序比此处的值更重要。

所以你应该帮自己一个忙:将 ID 转换为字符串,传输,然后用于Integer.valueOf( String )转换回数值。这是你真正知道你在另一边得到什么的唯一方法——当然,除非你要编写自己的序列化类。

于 2012-08-31T18:11:36.513 回答