Java 自定义对象的BlazeDS和ArrayList

Java 自定义对象的BlazeDS和ArrayList,java,apache-flex,actionscript-3,blazeds,Java,Apache Flex,Actionscript 3,Blazeds,我正在使用BlazeDS将Flex与Java连接起来。我很难将自定义对象的数组列表从Flex传递到java 我有两个对象,一个称为类别,另一个称为节。类别具有截面对象的ArrayList。我可以在Flex和Java之间来回发送Category对象的ArrayList,问题是当我尝试访问从Flex返回到Java的Category对象的ArrayList部分时,出现以下错误: flex.messaging.MessageException: java.lang.ClassCastException

我正在使用BlazeDS将Flex与Java连接起来。我很难将自定义对象的数组列表从Flex传递到java

我有两个对象,一个称为类别,另一个称为节。类别具有截面对象的ArrayList。我可以在Flex和Java之间来回发送Category对象的ArrayList,问题是当我尝试访问从Flex返回到Java的Category对象的ArrayList部分时,出现以下错误:

flex.messaging.MessageException: java.lang.ClassCastException : flex.messaging.io.amf.ASObject

出于某种原因,我得到的是一个AsObject的ArrayList,而不是我的Section对象。我尝试在actionscript中查找如何显式键入数组,但我唯一能找到的是使用向量对象,BlazeDS不支持向量对象。是否可以在类别对象的ArrayList中传递截面对象的ArrayList,或者我必须找到另一种解决方法?

AS3最常见的问题之一是缺少类型化数组。ArrayList将只包含对象,您必须自己强制转换结果

下面是一个Java和AS3类的示例,我将介绍它

在Java中:

顶级课程:

package mystuff;

public class StuffToSend
{
    public List<Section> sections;
    ...
}
在AS3中:

package mystuff
{
    [RemoteClass(alias="mystuff.StuffToSend")] // So AS3 knows which Java class to map
    public class StuffToSend
    {
        public var sections:ArrayCollection;
        ...
    }
}

package mystuff 
{
    [RemoteClass(alias="mystuff.Section")] // So AS3 knows which Java class to map
    public class Section 
    {
        public var categories:ArrayCollection;
        ...
    }
}

package mystuff 
{
    [RemoteClass(alias="mystuff.Category")] // So AS3 knows which Java class to map
    public class Category
    {
        ...
    }
}  

您可以在此处了解有关remoteObjects的更多信息:

Flex实际上正在发回一个Flex.messaging.io.ArrayCollection对象。下面是将其转换为java类的ArrayList的代码:

public ArrayList<MyObject> convertArrayCollection(ArrayCollection array){
        ArrayList<MyObject> myObjectArray = new ArrayList();
        ASTranslator ast = new ASTranslator();
        MyObject myObject;
        ASObject aso;

        for (int i=0;i< array.size(); i++){
            myObject = new MyObject();
            aso = new ASObject();

            aso = (ASObject) array.get(i);
            aso.setType("com.myPackage.MyObject");
            myObject = (MyObject) ast.convert(aso, MyObject.class);
            myObjectArray.add(myObject);
        }
        return myObjectArray;
    }
publicArrayList转换器ArrayCollection(ArrayCollection数组){
ArrayList myObjectArray=新的ArrayList();
ASTranslator ast=新ASTranslator();
肌体肌体;
aso对象aso;
对于(int i=0;i
真正的答案是,BlazeDS很愚蠢,需要类引用才能将活动脚本对象映射回Java(即使它刚刚成功地将完全相同的对象从Java映射到AS)。今天我在同样的问题上浪费了不少时间。我有很多类似的映射,它们都工作得很好,但今天我创建了一个新的映射,它开始给我类强制转换异常

在这里找到了答案:

在您的情况下,解决方案是:

package mystuff
{
    [RemoteClass(alias="mystuff.Section")] 
    public class Section
    {
        private var stupidBlazeDs : Category;
        public var categories:ArrayCollection;
    ...
    }
}

可能有更好的选择,但我今天已经有足够的选择了。

我会选择AS端还是java端?你能给我指出一些例子的方向吗?谢谢你的例子。这就是我的代码,当我将类别对象的ArrayList从java传递到actionscript,然后返回到java时,问题就出现了。我在java中的以下代码行中获得了类强制转换异常:categories.get(1.getSections();你能提供变量声明吗?如果您不提供类型,我不知道为什么会导致错误。可能您没有正确声明泛型?以下是AS3中我的类别类:package my.package{import mx.collections.ArrayCollection;[Bindable][RemoteClass(alias=“my.package.Category”)]公共类别{public function Category(){}…public var sections:ArrayCollection;}和Section:package my.package{import mx.collections.ArrayCollection;[Bindable][RemoteClass(alias=“my.package.Section”)]公共类节{public function Section(){}…public var sectionName:String;}}}以下是我的java类:公共类类别实现可序列化的{…private ArrayList sections;}公共类节实现可序列化的{…私有字符串sectionName;}
public ArrayList<MyObject> convertArrayCollection(ArrayCollection array){
        ArrayList<MyObject> myObjectArray = new ArrayList();
        ASTranslator ast = new ASTranslator();
        MyObject myObject;
        ASObject aso;

        for (int i=0;i< array.size(); i++){
            myObject = new MyObject();
            aso = new ASObject();

            aso = (ASObject) array.get(i);
            aso.setType("com.myPackage.MyObject");
            myObject = (MyObject) ast.convert(aso, MyObject.class);
            myObjectArray.add(myObject);
        }
        return myObjectArray;
    }
package mystuff
{
    [RemoteClass(alias="mystuff.Section")] 
    public class Section
    {
        private var stupidBlazeDs : Category;
        public var categories:ArrayCollection;
    ...
    }
}