0

クライアント - サーバー基本アプリケーションがあります。クライアントは単純なリモート処理を使用してサーバー側と通信します。サーバー側は、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 のバグですか?

助けてくれてありがとう。質問は私のブログで複製されます。

4

3 に答える 3

2

あなたは試すことができます:

            registerClassAlias( "mx.collections.ArrayCollection", ArrayCollection);
            registerClassAlias("flex.messaging.io.ArrayCollection", ArrayCollection);
于 2012-10-13T01:38:41.127 に答える
1

MyCollection のエイリアスを追加してみてください。

IExternalizable を実装するすべてのクラスにエイリアスがあるまで、役に立たないエラー #2004 が発生しました。私の場合、それは永続性 (ViewNavigatorApplicationBase.persistNavigatorState = true) のためでした。アプリの事前初期化イベントは正常に機能します。

于 2012-03-02T17:57:13.627 に答える
0

(デ) シリアル化されているクラスの一部は、おそらく Flex プロジェクトにリンクされていません。メインの Application/Module ファイルに以下を追加してみてください:

private var forceReference:Array = [YourClass1, YourClass2];
于 2014-01-28T10:19:32.333 に答える