クライアント - サーバー基本アプリケーションがあります。クライアントは単純なリモート処理を使用してサーバー側と通信します。サーバー側は、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 候補) メソッドを公開し、以下に示すようにクライアント側に実装しました。
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: パラメーターの 1 つが無効です。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 のバグですか?
助けてくれてありがとう。質問は私のブログで複製されます。