我有一个返回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中吗?
答案 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>