Hi Alex,

Thanks for the reply but I am using [RemoteClass] metadata:

    [RemoteClass(alias="ResultObj")]
    public class ResultObj implements IExternalizable

Is there something else I should be using in the above line?

Many thanks,
Ash

--- In [email protected], "Alex Harui" <[EMAIL PROTECTED]> wrote:
>
> Use [RemoteClass] metdata instead
> 
>  
> 
> ________________________________
> 
> From: [email protected] [mailto:[EMAIL PROTECTED] On
> Behalf Of ash4os
> Sent: Saturday, July 05, 2008 11:17 PM
> To: [email protected]
> Subject: [flexcoders] Problem with IExternalizable
> 
>  
> 
> Hi everyone,
> 
> I am relatively new at Flex and am having writing a sample using the
> IExternalizable interface. I have a Java object on the server side that
> I want to send to the Flash player. I have searched through the older
> posts on this group and on various other blog posts but not much help.
> Here is the sample code: (sorry if it is a bit long)
> 
> >>>>>>>>>>>>>>>>>>>>>>>>>>>> File: ResultObj.as
> package
> {
>     import flash.utils.IDataInput;
>     import flash.utils.IDataOutput;
>     import flash.utils.IExternalizable;
>     
>     [RemoteClass(alias="ResultObj")]
>     public class ResultObj implements IExternalizable
>     {
>         // number of records
>   &n! bsp;     public var m_numRecords:int;      
>         // view name
>         public var m_viewName:String;
>         
>         public function ResultObj()
>         {   }
>         
>         public function readExternal (input:IDataInput):void
>         {
>             m_viewName   = input.readObject();
>             m_numRecords = input.readInt();
>         }
>         
>         public function writeExternal (output:IDataOutput):void
>       ! ;  {
>           ! ;  output.writeObject(m_viewName);
>             output.writeInt(m_numRecords);
>         }
>     }
> }
> 
> >>>>>>>>>>>>>>>>>>>>>>>>>>>> File: main.mxml
> <?xml version="1.0" encoding="utf-8"?>
> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml";
> layout="absolute">
> 
> <mx:RemoteObject id="ViewObj" destination="ViewRemoteObject">
>     <mx:method name="foo">
>         <mx:arguments>
>             <Arg1>
>                 rowId
>             </Arg1>
>             <Arg2>
>                 numRows
>             </Arg2>
>         </mx:arguments>
>     </mx:method>
>     
>     <mx! :method name="getResults">
>         <mx:arguments>
>             <Arg1>
>                 accRowId
>             </Arg1>
>             <Arg2>
>                 numRows
>             </Arg2>
>         </mx:arguments>
>     </mx:method>
> </mx:RemoteObject>
> 
> 
> <mx:Script>
>     <![CDATA[
>         import mx.rpc.remoting.mxml.RemoteObject;
>         import mx.rpc.events.ResultEvent;
>         import ResultObj;! 
>         
>   &nbs! p;   ;   
>         // create a compile time dependency on ResultObj class
>         private static const REG:* =
> registerClassAlias("ResultObj",ResultObj);
>         private var m_ResultObj:ResultObj;
>         
>         private function getList(event:Event):void {
>             ViewObj.addEventListener(ResultEvent.RESULT,
> displayResponse);
>             ViewObj.addEventListener(FaultEvent.FAULT,   displayFault);
>             ViewObj.getResults(AccountId.text, 1);
>             registerClassAlias("ResultObj", ResultObj);
>      &n! bsp;  }
>         
>         private function displayResponse(resEvt:ResultEvent):void {
>             Alert.show("displayReponse called, " + resEvt.toString());
>             m_ResultObj = resEvt.result as ResultObj;
>         }
>         
>         private function displayFault(resEvt:Event):void {
>             Alert.show("displayFault called, " + resEvt.toString());
>         }
>     ]]>
> </mx:Script>
> 
>     <mx:WipeLeft id="myWL" duration="500"/>
>     
>     <mx:Panel width="617" height="608" layout="absolute" left=! "10"
> top="10" title="Account Detail" id="AcctOptView">
> &! nbsp;&nb sp;      <mx:VDividedBox x="10" y="0" height="480"
> width="577">
>             <mx:Canvas label="AccountsCanvas" width="100%" height="100%"
> backgroundColor="#FFFFCC">
>             
>                 <mx:Form x="10" y="10" width="557" height="215" >
>                     <mx:FormHeading label="Enter Account Details"
> width="304" />
>                     
>                     <mx:FormItem label="Account Name">
>                         <mx:TextInp! ut id="AccountName" width="200"
> text=""/>
>                     </mx:FormItem>
>                     <mx:FormItem label="Account Id">
>                         <mx:TextInput id="AccountId" width="100"/>
>                     </mx:FormItem>
>                     <mx:FormItem label="Primary Contact">
>                         <mx:TextInput id="PrimaryContact" width="200" />
>                 &nb! sp;   </mx:FormItem>
>     &nb! sp;  ;              
>                     <mx:Button label="GetAccounts"
> click="getList(event)" id="GetAccounts"/>
>                 </mx:Form>
>             
>             </mx:Canvas>
>             <mx:Canvas label="Canvas 1" width="100%" height="100%"
> backgroundColor="#FFFFCC">
>             
>             </mx:Canvas>
>         </mx:VDividedBox>
>     </mx:Panel>
> </mx:Application>
> 
> And I have the following in the remoting-config.xml
> <! ;destination id="ViewRemoteObject">
>    <properties>
>      <source>MyView</source>
>    </properties>
> </destination>
> 
> On the Java side I have following source code:
> 
> >>>>>>>>>>>>>>>>>>>>>>>>>>>MyView.java
> public class MyView {
> 
>     public MyView () {
>     }
>     
>     public ResultObj getResults (String viewName, int numRecords) {
>         ResultObj res = new ResultObj ();
>         
>         return (res);
>     }
> }
> 
> >>>>>>>>>>>>>>>>>>>>>>>>>>> ResultObj.java
> public class ResultObj implements Externalizable {
>   !   private String         m_! viewName ;
>     private Integer        m_numRecords;
>     
>     public ResultObj() {
>         m_numRecords = new Integer (0);
>         m_viewName   = new String ("Dummy Default View");
>     }
> 
>     /*
>      * (non-Javadoc)
>      * @see java.io.Externalizable#readExternal(java.io.ObjectInput)
>      */
>     public void readExternal (ObjectInput in) 
>         throws IOException, ClassNotFoundException 
>     {
>         m_viewName   = (String) in.readObject();
>         m_numRecords = in.readInt();
>     }
>     
>     /*     * (non-Javadoc)
>      * @see java.io.Externalizable#writeExternal(java.io.ObjectOutput)
>      * 
>      * Serializes the server state of an instance of ResultObj
>      * to the AMF client (Flash in the browser)
>      */
>     public void writeExternal (ObjectOutput out) throws IOException {
>         System.err.println("[ResultObj::writeExternal]");
>         out.writeObject(m_viewName);
>         out.writeInt(m_numRecords);
>         System.err.println("Completed [ResultObj::writeExternal]");
>     }
> }
> 
> Both the Java files are compiled and put under
> D:\lcds\jrun4\servers\default\flex\WEB-INF\classe! s. I debugged this
> more and the method MyView::getResults is b! eing inv oked and the
> method ResultObj::writeExternal also gets invoked successfully but on
> the browser side I get the following error 
> 
> ArgumentError: Error #2004: One of the parameters is invalid.
> 
> And then I get the following error:
> 
> displayFault called, [FaultEvent fault=[RPC Fault faultString="Didn't
> receive an acknowledge message" faultCode="Server.Acknowledge.Failed"
> faultDetail="Was expecting mx.messaging.messages.AcknowledgeMessage, but
> received null"] messageId="CEE768B6-6010-738A-C432-5C83918438BE"
> type="fault" bubbles=false cancelable=true eventPhase=2]
> 
> So I am guessing the browser side doesn't know to construct the object
> ResultObj.as. If anyone can shed some light on how to fix it that would
> be very much appreciated.
> 
> Many thanks,
> Ash
>


Reply via email to