2012-02-05 2 views
0

클라이언트 - 서버 기본 응용 프로그램이 있습니다. 클라이언트는 간단한 리모팅을 사용하여 서버 측과 comunicate합니다. 서버 측은 WebORB, BlazeDS 또는 기타 제품에서 전원을 공급받을 수 있습니다. 클라이언트 측에서 FLEX 프레임 워크를 사용하고 있습니다. 그것은 기술 스택에 관한 것입니다.flash.utils.IExternalizable + Remoting + Flex 오류 # 2004

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; 
     }  
    } 
} 
: 이제, 서버 측 잊어 보자 그냥

package com.blog.ri 
{ 
    import mx.collections.ArrayCollection; 

    public class MyCollection extends ArrayCollection 
    { 
     public function MyCollection(source:Array=null) 
     { 
      super(source); 
     } 
    } 
} 

또한 다음과 같은 클라이언트 측에서 봐 가지고, 이제 우리는 다음 클래스가 있고이 서버 측 클래스에 매핑되는 가정하자

또한, 서버 측 서비스 클라이언트 (MyEntity 후보) 방법 저장 공간에 노출하고 아래와 같이 I 클라이언트 측을 구현 :

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); 
     } 

    } 
} 

를 마지막으로 t 시도 이 아래 그림과 같이 오 우리의 주요 MXML 파일의 MyEntity 클래스의 새 인스턴스를 저장 : 그것은

protected function creationCompleteHandler():void 
      { 
       var myService:MyService = new MyService(); 

       var candidate:MyEntity = new MyEntity(); 
       candidate.myCollection = new MyCollection(); 

       myService.save(candidate); 
      } 

즉. 당신이 볼 수 있듯이

ArgumentError: Error #2004: One of the parameters is invalid. at flash.net::NetConnection/invokeWithArgsArray() at flash.net::NetConnection/call() at mx.messaging.channels::NetConnectionChannel/internalSend()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\NetConnectionChannel.as:281] at mx.messaging.channels::AMFChannel/internalSend()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:364] at mx.messaging::Channel/send()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\Channel.as:1002] at mx.messaging.channels::PollingChannel/send()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\PollingChannel.as:394] at mx.messaging::ChannelSet/send()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1429] at mx.messaging::ChannelSet/channelConnectHandler()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\ChannelSet.as:1084] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.messaging::Channel/connectSuccess()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\Channel.as:1148] at mx.messaging.channels::AMFChannel/resultHandler()[E:\dev\hero_private\frameworks\projects\rpc\src\mx\messaging\channels\AMFChannel.as:576]

, 내가있는 ArrayCollection 클래스를 확장하고, 어도비 문서에 따르면, ArrayCollection에이 IExternalizable interface를 구현 : 나는 코드를 실행하면, 다음과 같은 예외를 받았다. 문제를 지역화하기로 결정하고 IExternalizable을 구현하는 간단한 클래스를 만들었습니다. 그런 다음이 클래스를 다른 MyChild 클래스에서 확장하고 MyEntity 클래스에서 MyChild 속성을 정의했습니다. 이 경우 위에서 예외가 발생했습니다. 어떻게 코드를 작성했는지 또는 플렉스 내의 버그입니까?

도움 주셔서 감사합니다. 질문은 내 블로그에 중복되어 있습니다.

답변

1

MyCollection에 대한 별칭을 추가해보십시오.

IExternalizable을 구현하는 모든 클래스가 별칭을 가질 때까지 도움이되지 않는 Error # 2004가 있습니다. 제 경우에는 지속성 (ViewNavigatorApplicationBase.persistNavigatorState = true)이었습니다.이 경우 View.deserializeData()를 시작하기 전에 시작시 registerClassAlias를 일찍 호출했는지 확인해야했습니다. 앱의 preinitialize 이벤트가 정상적으로 작동합니다.

+0

, 즉 ['[RemoteClass라는]'] (http://stackoverflow.com/questions/1671668)하는 일입니다. 또는 최소한, 그게해야 할 일입니다. (지금은 'RemoteClass'가 작동하지 않는 문제가 있습니다.) * –

+0

그는 MyEntity에서만 사용하고 있습니다. 따라서 제안 해 드리겠습니다. MyCollection에 대해서도 마찬가지입니다. – User5910

2

당신은 시도 할 수 : 수업의

  registerClassAlias("mx.collections.ArrayCollection", ArrayCollection); 
      registerClassAlias("flex.messaging.io.ArrayCollection", ArrayCollection); 
0

일부가되는 (비) 직렬화 아마 플렉스 프로젝트에 연결되지 않습니다. 추가 주요 응용 프로그램/모듈 파일에 다음과 같은 시도 : 그는 이미이 일 것

private var forceReference:Array = [YourClass1, YourClass2];