BlazeDs在将数据从flex传递到java时将int转换为float



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

我在flex中通过blaze将922927950传递回java。当java获得时,它已经转换为9.2292795E8

我在flex中的代码是

service.getRemoteObject().sendData(objectIds);

其中object id是ArrayCollection。在这个我可以调试和看到的数字是922927950。然后我可以调试java,并看到它已经转换为9.2292795E8

sendData具有以下签名

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

我尝试过将flex对象数组更改为包含数字而不是int,但这也不起作用。据我所知,在java中,要存储9.2292795E8,数字必须是浮点值。在java中,Float确实适合整数,所以我认为这就是为什么我不会得到类型不匹配错误的原因。问题是,id现在采用了科学的表示法,这破坏了我使用它们的jpa查询。

有人知道为什么这个数字被转换成科学记数法吗?

感谢

更新

经过更多的调查,情况变得更加奇怪。我在我的java 中尝试了以下代码

public void sendData(List<Integer> objectIds) {
    List<Integer> converted = new ArrayList<Integer>();
    for (Integer objectId : objectIds) {
        converted.add(objectId);
    }
    ...
}

我现在得到类强制转换异常,说我不能在转换后的.add(objectId)行上将double转换为integer

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

在flex中,当我将922927950转换为Number时,就会发生这种情况,我认为Number映射为Double。我的问题是,我在java端使用泛型,而BlazeDs不考虑这些,所以只在没有泛型的签名上匹配?

首先,查看Amf3Types文档:

避免升级为通过AMF 3发送的ActionScript编号为2^28-1,或0x0FFFFFFF

以十进制表示,这是268435455,922927950远远超过了这个极限。请注意,这是一个序列化问题: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。请参阅此处和此处的文档。

谨致问候,弗兰克。

正如@Franck Wolff所解释的,由于值存储在内存中的技术原因,在使用大数字时会遇到各种各样的问题——不仅是在Flex和BlazeDS之间传输时,而且通常使用数值时。

由于你似乎没有使用这些数字进行任何计算,我认为正确的序列比这里的值更重要。

因此,您应该帮自己一个忙:将ID转换为String,transfer,然后使用Integer.valueOf( String )将其转换回数值。这是您真正确定从另一端得到什么的唯一方法——当然,除非您要编写自己的序列化类。

相关内容

  • 没有找到相关文章

最新更新