有一个客户端-服务器基本应用程序。客户端使用简单的远程处理与服务器端通信。服务器端可以使用 WebORB、BlazeDS 或任何其他产品。客户端使用 FLEX 框架。这就是关于技术堆栈的内容。现在,让我们忘记服务器端,看看下面的客户端
package com.blog.ri
{
import mx.collections.ArrayCollection;
public class MyCollection extends ArrayCollection
{
public function MyCollection(source:Array=null)
{
super(source);
}
}
}
此外,假设我们有以下类并且它被映射到服务器端类:
package com.blog.ri
{
[Bindable]
[RemoteClass(alias="com.blog.ri.MyEntity")]
public dynamic class MyEntity
{
private var _myCollection:MyCollection;
public function get myCollection():MyCollection
{
if(_myCollection == null)
_myCollection = new MyCollection();
return _myCollection;
}
public function set myCollection(value:MyCollection):void
{
_myCollection = value;
}
}
}
此外,服务器端服务为客户端公开了 void save(MyEntity Candidate) 方法,我在客户端实现了它,如下所示:
package com.blog.ri
{
public class MyService
{
private var _remoteObject:RemoteObject;
public function MyService()
{
var channelSet:ChannelSet = new ChannelSet();
var amfChannel:AMFChannel = new AMFChannel("my-amf", "http://localhost/weborb.aspx");
channelSet.addChannel(amfChannel);
_remoteObject = new RemoteObject("GenericDestination");
_remoteObject.channelSet = channelSet;
_remoteObject.source = "com.blog.ri.MyService";
_remoteObject.getDetailedStatistic.addEventListener("result",onItemSaved);
_remoteObject.addEventListener("fault", onFault);
}
public function save(candidate:MyEntity, responder:IResponder = null ):void
{
var asyncToken:AsyncToken = _remoteObject.save(candidate);
if( responder != null )
asyncToken.addResponder( responder );
}
}
}
最后,我尝试在我们的主 mxml 文件中保存 MyEntity 类的新实例,如下所示:
protected function creationCompleteHandler():void
{
var myService:MyService = new MyService();
var candidate:MyEntity = new MyEntity();
candidate.myCollection = new MyCollection();
myService.save(candidate);
}
这就对了。当我运行代码时,我收到以下异常:
ArgumentError:错误 #2004:其中一个参数无效。在 flash.net::NetConnection/invokeWithArgsArray() 在 flash.net::NetConnection/call() 在 mx.messaging.channels::NetConnectionChannel/internalSend()[E:\dev\hero_private\frameworks\projects\rpc\src \mx\messaging\channels\NetConnectionChannel.as:281] 在 mx.messaging.channels::AMFChannel/internalSend()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel。 as:364] 在 mx.messaging::Channel/send()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\Channel.as:1002] 在 mx.messaging.channels::PollingChannel /send()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\PollingChannel.as:394] 在 mx.messaging::ChannelSet/send()[E:\dev\hero_private \frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:
如您所见,我扩展了 ArrayCollection 类,根据 Adobe 文档,ArrayCollection 实现了IExternalizable 接口。我决定将问题本地化并创建一个实现 IExternalizable 的简单类。然后,我在其他一些 MyChild 类中扩展了这个类,并在 MyEntity 类中定义了 MyChild 属性。在这种情况下,我也收到了上述异常。我是如何编写代码的,还是 flex 中的错误?
谢谢你的帮助。这个问题在我的博客中有重复。