5

我正在使用 BlazeDS 将 Flex 与 Java 连接起来。我在将自定义对象的 ArrayLists 从 Flex 传递到 java 时遇到问题。

我有两个对象,一个叫Category,另一个叫Section。Category 具有 Section 对象的 ArrayList。我可以在 Flex 和 Java 之间来回发送 Category 对象的 ArrayList,问题是当我尝试访问从 Flex 返回到 Java 的 Category 对象的部分 ArrayList 时,我收到以下错误:

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

出于某种原因,我得到了一个 ASObjects 的 ArrayList 而不是我的 Section 对象。我尝试查找如何在 actionscript 中显式键入数组,但我唯一能找到的是使用 BlazeDS 不支持的 Vector 对象。是否可以在 Category 对象的 ArrayList 中传递 Section 对象的 ArrayList,还是我必须找到另一种方法?

4

3 回答 3

4

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

这是我将传递的 Java 和 AS3 类的示例。

在 Java 中:

顶级班:

package mystuff;

public class StuffToSend
{
    public List<Section> sections;
    ...
}

部分类:

package mystuff;

public class Section
{
    public List<Catagory> categories;
    ...
}

分类类:

package mystuff;

public class Category
{
    ...
}

在 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 的更多信息:数据访问

于 2009-04-16T21:08:07.940 回答
4

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;
    }
于 2009-04-20T19:11:35.270 回答
0

真正的答案是,BlazeDS 是愚蠢的,并且需要类引用才能将您的活动脚本对象映射回 Java(即使它只是成功地将完全相同的对象从 Java 映射到 AS)。我今天在完全相同的问题上浪费了很多时间。我有很多类似的映射,它们都工作得很好,但是今天我创建了一个新的,它开始给我类转换异常。

在这里找到答案:链接

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

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

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

于 2011-06-07T15:11:25.287 回答