有一个客户端 - 服务器基本应用程序。客户端使用简单的远程处理与服务器端通信。服务器端可以启动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()at flash.net::NetConnection/call()at mx.messaging.channels ::的NetConnectionChannel / internalSend()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\通道\ NetConnectionChannel.as:281] 在 mx.messaging.channels ::的AMFChannel / internalSend()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\通道\ AMFChannel.as:364] 在 mx.messaging与::通道/发送()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\ Channel.as:1002] 在 mx.messaging.channels :: PollingChannel /发送()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\通道\ PollingChannel.as:394] 在 mx.messaging与:: ChannelSet的/发送()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\ ChannelSet.as:1429] 在 mx.messaging与:: ChannelSet的/ channelConnectHandler()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\ ChannelSet.as:1084] 在flash.events::EventDispatcher/dispatchEventFunction()at flash.events :::EventDispatcher / dispatchEvent()at mx.messaging与::通道/ connectSuccess()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\ Channel.as:1148] 在 mx.messaging.channels ::的AMFChannel / resultHandler()[E:\ dev的\ hero_private \框架\项目\ RPC \ SRC \ MX \消息\通道\ AMFChannel.as:576]
如您所见,我扩展了ArrayCollection类,并根据Adobe文档,ArrayCollection实现了IExternalizable interface。我决定将问题本地化并创建一个实现IExternalizable的简单类。然后,我在其他一些MyChild类中扩展了这个类,并在MyEntity类中定义了MyChild属性。在这种情况下,我也收到了上述例外情况。我是如何编写代码的,或者是flex中的一个bug?
感谢您的帮助。 这个问题在我的博客中重复了。
答案 0 :(得分:2)
你可以尝试:
registerClassAlias( "mx.collections.ArrayCollection", ArrayCollection);
registerClassAlias("flex.messaging.io.ArrayCollection", ArrayCollection);
答案 1 :(得分:1)
尝试为MyCollection添加别名。
我得到了无用的错误#2004,直到我实现IExternalizable的所有类都有别名。在我的情况下,它是持久性(ViewNavigatorApplicationBase.persistNavigatorState = true),在这种情况下,我必须确保我在启动时尽早调用registerClassAlias以在View.deserializeData()之前。应用程序上的preinitialize事件正常。
答案 2 :(得分:0)
某些(de)序列化的类可能没有链接到Flex项目中。尝试将以下内容添加到主应用程序/模块文件中:
private var forceReference:Array = [YourClass1, YourClass2];