Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BlazeDs在将数据从flex传递到java时将int转换为float_Java_Apache Flex_Type Conversion_Blazeds - Fatal编程技术网

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

BlazeDs在将数据从flex传递到java时将int转换为float,java,apache-flex,type-conversion,blazeds,Java,Apache Flex,Type Conversion,Blazeds,我在将int从flex传递回java时遇到了一个问题。问题中的int是一个ID,我今天早上似乎已经达到了一个临界值,因为事情开始破裂 我通过blaze将flex中的922927950传递回java。当java获取时,它已经转换为9.2292795E8 我在flex中的代码是 service.getRemoteObject().sendData(objectIds); 其中,对象ID是ArrayCollection。在这个我可以调试和看到的数字是922927950。然后我可以调试java,并看到

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

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

我在flex中的代码是

service.getRemoteObject().sendData(objectIds);
其中,对象ID是ArrayCollection。在这个我可以调试和看到的数字是922927950。然后我可以调试java,并看到它已转换为9.2292795E8

sendData具有以下签名

public void sendData(List<Integer> objectIds) {...}
在flex中,当我将922927950转换为我假定映射为双精度的数字时,就会发生这种情况。我的问题是我在java方面使用泛型,而BLZEDS不考虑这些,只是在没有泛型的签名上匹配?

,请看:

避免升级为整数的整数的最大值 通过AMF 3发送的操作脚本编号为2^28-1或0x0FFFFFFF

十进制表示为268435455,922927950远远超过此限制。请注意,这是一个序列化问题:能够保存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());
    }
    ...
}
public void sendData(列出objectid){
列表转换=新的ArrayList();
for(对象objectId:objectId){
转换后的.add(((Number)objectId.intValue());
}
...
}

如果您需要更好地控制类型转换和高级数值类型,则应该考虑使用BLAZEDS。请参阅文档和

问候,,
Franck。

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

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


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

谢谢你,弗兰克。我刚刚做了类似的事情;)我登录以便添加这一点,我正在将双精度转换为一个有趣的数字,如果我在flex中使用数字,那么这也不起作用。我的java端有一个整数,所以可能映射不太正确,因为BlazeDS没有尝试将列表转换为整数列表(因此出现了classcast异常),所以它不起作用。所以:如果Flex int大于2^28-1或是Flex数字,序列化后会得到一个Java Double,而这个Double不能直接转换为整数……谢谢Franck。我之前看过这个,我想这让我很困惑。它说int是2^31,虽然看起来是错的,但实际上是对的:可以将(2^31-1)存储到Flash/Flex/ActionScript3中的int变量中。这只是AMF3序列化问题,因为他们(Adobe)选择使用可变长度编码。如果您感兴趣,请阅读以下内容:(0x04:integer部分)。基本上,如果int在[-2^28,+2^28-1]范围内,则序列化后它将保持为整数(您将获得一个Java整数)。否则,它将被提升为一个数字,并且在Java端得到一个Double。疯狂,但就是这样;)将数值转换为字符串是一种变通方法,比丢失部分值要好,但仍然是一种变通方法。此外,它可能会迫使您使用中间DTO,这至少很麻烦……再次,我建议您使用GraniteDS及其广泛可靠的Java数字类型支持:。但是从BlazeDS到GraniteDS的迁移当然可能有点复杂,这取决于项目的当前状态(请参阅)。这实际上取决于项目。如果已经完成的工作量很大,我肯定不会重写,而是将转换移到可能的最低层(可能是数据访问层,除非在数据库中使用VARCHAR id是一个选项),并在程序的其余部分使用字符串。另外,我只能根据自己的经验说:企业客户通常更愿意使用Adobe产品,即使它在技术上是次等的。是的,你是对的,这取决于项目。然而,关于使用Adobe产品的企业客户,人们可能会注意到Flex(可能在不久的将来还包括BlazeDS)不再是Adobe项目,而选择由Adobe支持的Flex解决方案似乎并不特别令人放心。而且,Apache仍然是更为知名的地址。;)顺便说一句,我迫不及待地想让BlazeDS更换所有者——这该死的东西急需更新,而且他们似乎已经一年多没有更新了。
 java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
public void sendData(List<?> objectIds) {
    List<Integer> converted = new ArrayList<Integer>();

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