Richard Rodseth wrote: > Has anyone done the work to enhance Darron Schall's ObjectTranslator > class to work recursively, as he describes in the source code? > > In the absence of that, I was think of adding static factory methods > to my VO objects, as follows: > > static public function newInstanceFromJSON(json : String) : StudentVO { > var student:Object = JSON.decode( json ); var > studentVO:StudentVO = > ObjectTranslator.objectToInstanc(student,StudentVO); > > for ( var i:int = 0; i < studentVO.books.length; i++ ) > { > var bookVO:BookVO = ObjectTranslator.objectToInstance( > studentVO.books[i], BookVO ) as BookVO; > // Use the converted class instance in place of the regular > object > studentVO.books[i] = bookVO; > } > return studentVO; > } > > Comments welcome. >
I use a return type of array to obtain a dynamic object(DO) object graph from a HTTPService call that returns xml. I pass the result object to the top most VO, which then inits the graph of VO objects(using factory methods). The DO is adapted/proxied/decorated by the VO so there is no copying of data from dynamic to strongly typed; the functions calls are proxied to the DO. This provides a lot of control and has a few benefits for me: . Able to access and use the internal dynamic object if required without making the VO class dynamic. . Generated "_Classes" make changes to xml returned from server very easy to manage. New properties or event handlers etc. can easily be added to all model objects. . Able to use the internal dynamic object to JSON encode the return(POST) data. . Use of strongly typed objects within AS and mxml. . Conversion from booleans to "Y", "N", "A" "I" (yes/no/active/inactive) values or Dates to String types is straight forward. Eg) class XYZ extends _XYZ{ //xyz has many abc objects. private abcObjects:ArrayCollection; //called on result of a http service invocation public static function newInstance(rootObj:Object):XYZ{ //create and return an instance of XYZ. //init the children objects by calling there factory function var obj:XYZ = new _XYZ(rootObj); obj.initABCObjects(); return obj; } protected function initABCObjects():void{ abcObjects = new ArrayCollection(); if (super.oData.abcObjects){ //loop creating and adding to abcObjects using //ABC.newInstance(abcObjects[i]); } } } //perl generated AS class contains functions to access simple properties // complex properties of VO's are handled in the subclass. class _XYZ { private var _o:Object; public function _XYZ(o:Object){ _o = o; } public function get oData():Object{ return _o; } public function getName():String{ return _o.name; } public function setName(name:String):void{ _o.name = name; } } There are probably better ways to do this but I've had reasonable success to-date with the approach described above. The generated code really makes it easy when things are constantly changing during development. regards, - shaun