Move some figures arround, press Save, Close app, Re-open and notice how figure location is persisted... View source code [1]
Shared Object
Une application Flash a accès au file-system de façon très restreinte, via la technique des SharedObjet. A l'image des Cookies pour les applications web.
Dans le cas de l'application Flash, on dispose d'un espace de stockage, in fine, orienté objet : tout objet (ou grappe d'objet) AS3 peut être sérialisé en AMF3 pour être stocké sous forme de SharedObject. Pour que la dé-sérialisation opère correctement il convient d'enregistrer les classes, typiquement avec le meta-tag RemoteClass.
package model { [RemoteClass( alias="model.ImageVO")] public class ImageVO { public var source:String; public var x:Number; public var y:Number; }
Write
Ensuite, comme le monte la doc [2], il convient d'obtenir un SharedObject pour une nom donné, de lui adjoindre des données, et de réaliser l'écriture avec la méthode flush().
var mySO:SharedObject = SharedObject.getLocal("chessboard"); mySO.data['figure'] = new ImageVO('King.gif'); mySO.flush();
Read
Pour la lecture, c'est tout a fait similaire, sauf que l'on opèrere un down-cast pour promouvoir le typage fort.
var mySO:SharedObject = SharedObject.getLocal("chessboard"); var figure:ImageVO = mySO.data['figure'] as ImageVO;
Serializing UIComponents?
Notre exemple d'échiquier, est un simple Canvas qui contient des Images. L'exemple illustre également le déplacement d'image via Drag & Drop, explicité dans le post [3].
L'approche naïve, consiste dans un premier temps à tenter de sérialiser le Canvas ou les images. Cela ne fonctionnera pas. Un UIComponent comporte des centaines de propriétés et en générale on veut juste stocker quelques propriétés : dans notre exemple le positionnement x et y et la source pour une Image...
D'où la classe ImageVO, vue ci-dessus. C'est cette classe qui sera persistée. Il s'agit alors de prévoir l'instantiation d'une mx.controls.Image à partir de notre ImageVO. Plusieurs approches sont possibles ; on peut prévoir une sous-classe de Image qui ajoute simplement les accesseurs à la ValueObject correspondante :
public class ImageUI extends Image { public function get vo() : ImageVO { return new ImageVO( source, x, y, width, height); } public function set vo(ref:ImageVO):void { source = (ref!=null ? ref.source : null) ; width = ( ref!=null ? ref.width : 0); height = ( ref!=null ? ref.height : 0); x = ( ref!= null ? ref.x : 0); y = ( ref!= null ? ref.y : 0); } }
Pour bien faire, on aimerait bien ajouter un constructeur d'Image sur la base de son VO correspondant. Mais l'AS3 ne permet pas d'avoir plusieurs constructeurs, on peut en alternative opter pour une méthode statique de fabrication. Par exemple :
public static function newImage( vo:ImageVO, mouseDownCallback:Function=null) : ImageUI { var ref:ImageUI = new ImageUI(); ref.vo = vo; return ref; }
Muni de cette classe l'instantiation d'un UIComponent à partir du SharedObjet correspondant est très simple. Reste simplement à voir comment se présente la persistance pour une collection d'instance.
Array of data
Comme on a affaire à une vrai sérialisation AMF3, on peut aussi sérialiser directement un tableau d'objets. Par exemple :
private function doSave():void { mySO.data['figures'] = board.getChildren().map( function( item:ImageUI, index:int, arr:Array):ImageVO { return item.so } ); mySO.flush(); }



Flash Catalyst est un outil de design RIA anciennement connu sous le nom de projet Thermo.
FlashPlayer 10. La nouvelle version du runtime est sortie en octobre. Avec son lots d'améliorations [




