I am using Custom Serialization to serialize my Java Object (TreeNode class) "recursively" to ActionScript. But this fails giving the following exception:
ArgumentError: Error #2004: One of the parameters is invalid. at flash.utils::ObjectInput/readObject() at com.flex.dao::TreeNode/readExternal() (mx.messaging.messages::ErrorMessage)#0 body = (Object)#1 clientId = (null) correlationId = "5D934A88-B385-627D-2445-258088A878CA" destination = "" extendedData = (null) faultCode = "Server.Acknowledge.Failed" faultDetail = "Was expecting mx.messaging.messages.AcknowledgeMessage, but received null" faultString = "Didn't receive an acknowledge message" headers = (Object)#2 messageId = "983E8914-DDAC-1ECA-C02A-2580CCD4A40F" rootCause = (null) timestamp = 0 timeToLive = 0 ===================================================== The code of "ActionScript" and "Java" TreeNode classes is as under: ======= ActionScript ============ package com.flex.dao { import mx.collections.ArrayCollection; import flash.utils.IExternalizable; import flash.utils.IDataInput; import flash.utils.IDataOutput; import mx.controls.Alert; [RemoteClass(alias="com.java.dao.TreeNode")] public class TreeNode implements IExternalizable { public var name : String; public var id : int; public var type : int; public var children : ArrayCollection; public var data : Object; public function readExternal(input:IDataInput) : void { id = input.readInt(); name = input.readUTF(); type = input.readInt(); var childCount : int = input.readInt(); if(childCount != 0) { children = new ArrayCollection(); for(var i:int = 0; i<childCount;i++) { var obj : Object = input.readObject(); children.addItem(obj); } } var hasData : int = input.readInt(); if(hasData != 0) data = input.readObject(); } public function writeExternal(output:IDataOutput) : void { output.writeInt(id); output.writeUTF(name); output.writeInt(type); if(children != null) { output.writeInt(children.length); for(var i:int = 0; i<children.length;i++) output.writeObject(TreeNode(children.getItemAt(i))); } else output.writeInt(0); if(data != null) { output.writeInt(1); output.writeObject(data); } else output.writeInt(0); } } } ======== Java ========== public class TreeNode implements Externalizable { public List children; //list of TreeNode public Object data; public TreeNode() { } public TreeNode(int id, String name, int type) { super(id, name, type); children = new ArrayList(); } public void addChild(TreeNode child) { children.add(child); } public void writeExternal(ObjectOutput objectOutput) throws IOException { objectOutput.writeInt(id); objectOutput.writeUTF(name); objectOutput.writeInt(type); if(children != null && children.size() > 0) { System.out.println(name + " :: "+children.size()); objectOutput.writeInt(children.size()); for(int i = 0; i< children.size();i++) objectOutput.writeObject(children.get(i)); } else objectOutput.writeInt(0); if(data != null) { objectOutput.writeInt(1); objectOutput.writeObject(data); } else objectOutput.writeInt(0); } public void readExternal(ObjectInput objectInput) throws IOException, ClassNotFoundException { id = objectInput.readInt(); name = objectInput.readUTF(); type = objectInput.readInt(); int childCount = objectInput.readInt(); if(childCount != 0) { children = new ArrayList(); for(int i=0; i<childCount; i++) children.add((TreeNode)objectInput.readObject()); } int hasData = objectInput.readInt(); if(hasData != 0) data = objectInput.readObject(); } }