将ObjectProxy对象数组转换为自定义对象

时间:2011-06-10 23:41:49

标签: flex actionscript

我有一个返回ObjectProxy对象数组的服务。我想将其转换为自定义对象(值对象)并创建一个ArrayCollection。我怎么能这样做?

编辑:

我正在使用Django和PyAMF作为后端。我必须编写一个自定义SQL查询,我将结果记录包装在ObjectProxy中,并将整个结果作为ArrayCollection发送。

这是我的客户端代码:

[ArrayElementType("SessionVO")]
[Bindable]
private var _list:ArrayCollection;

private function onSessionResultSuccess(event:ResultEvent):void
{
    _list = new ArrayCollection(event.result as Array));
}

当我调试时,我注意到event.result的元素是ObjectProxy类型但_list变量是null。还有其他问题,而不是循环遍历event.result并将它们作为SessionVO对象复制到_list中吗?

4 个答案:

答案 0 :(得分:2)

如果在值对象上使用[RemoteClass]标记,则Flex远程处理(Blaze,LCDS)会在从远程服务调用发送/返回时将它们转换为您的值对象。

RemoteClass的语法是

[RemoteClass(alias="com.co.custom.remote.class")]  <--- point to the remote java/php class   def
Public Class FooBar
{
    public instance variable;
}

您的服务可以返回此类的数组或散列表,Flex远程处理将为您转换它。 在某些情况下,对象可能变得不透明,您可能需要创建ObjectProxy代码来执行自定义封送处理,但这并不常见。 RemoteClass编组可以处理非常ccomplex对象类型,子类型,对象中的嵌入对象等。只要AS侧的所有对象都使用RemoteClass键入,它就可以按预期工作。

答案 1 :(得分:0)

我不确定“ObjectProxy对象”是什么意思。我听起来像你已经返回了一系列自定义对象。

我建议查看某种形式的AMF网关。大多数serer语言都有一个AMF附加组件。它内置于ColdFusion,BlazeDS和LiveCycle中。 PHP有ZendAMF和AMFPHP。 .NET有FlourineFX和WebORB。这只是几个例子。

AMF网关具有自动转换功能;这样服务器端对象就可以轻松映射到客户端对象。以下是描述此内容的RemoteObject标记的一些信息。基本上,您在客户端对象上指定RemoteClass元数据,并且通常在服务器端对象上指定某种形式的映射。 AMF Gateway神奇地处理转换的其余部分。

在RemoteObject结果处理程序中,您只需将返回的数组转换为ArrayCollection。通常是这样的:

var resultArray : Array = event.result as Array;
var resultCollection : ArrayCollection = new ArrayCollection(resultArray);

如果您无法控制此应用程序的服务器端部分,则可能无法循环结果并手动将其转换为客户端Flex对象。

答案 2 :(得分:0)

您可以使用com.adobe.serializers.utility.TypeUtility;

public function result_handler(event:ResultEvent):void{

    var result:Array = TypeUtility.convertListToStrongType(event.result,YourValueObject) as Array;

}

答案 3 :(得分:0)

在web服务属性中生成makeObjectsBindable =“false”,它将返回对象。

<s:WebService id="ws" wsdl="http://`xxxx/mobiledata/MobileDataService.asmx?wsdl" fault="fault(event)">
    <s:operation 
        name="GetAll" 
        resultFormat="object"
        result="GetData(event)" makeObjectsBindable="false"
        />
    <s:operation 
        name="Create" 
        resultFormat="object"
        result="SaveData(event)"
        />
</s:WebService>