2009-05-11 2 views
3

Ich habe eine praktische Auflistungsklasse in meinem Flex-Projekt namens HashMap, das im Wesentlichen ein Wrapper um das flash.utils.Dictionary mit einer Reihe von Bequemlichkeitsmethoden und einem hinzugefügten (synchronisierten) ist ArrayCollection, damit ich die HashMap an bindbare Steuerelemente übergeben kann, die eine ArrayCollection benötigen. Das alles funktioniert gut.Richtig flashen.utils.Dictionary zu einem SharedObject serialisieren

Was nicht funktioniert, finde ich gerade heraus, setzt diese HashMap in einem lokalen SharedObject.

die Klasse Registrierung verursacht es gespeichert und wieder als die richtige Art zu werden, und das Arraycollection Mitglied kommt wieder ganz gut, aber das Wörterbuch seine Daten nicht speichern ..

Hier ist ein Ausschnitt:

[RemoteClass(alias="com.tamedtornado.collections.HashMap")] 
public class HashMap extends Proxy 
{ 
    public var hash:Dictionary = new Dictionary(); 

    // Keeps an array collection as well so we can give this to a data bound control 

    [Bindable] 
    public var collection:ArrayCollection = new ArrayCollection(); 

Also das ist das relevante Zeug. Wie wird vorgegangen, um das Dictionary korrekt zu speichern? Ich muss die ArrayCollection tatsächlich vorübergehend machen, da ich gerade jetzt, wenn die SO gelöscht wird, eine weitere Kopie der (im Dictionary eindeutig codierten) Daten erhalte.

Antwort

10

Ich bastelte mit diesem etwas mehr, und bekam viele doof Ergebnisse, die Serialisierung "gerade arbeiten lassen" lassen, also habe ich schließlich nur die IExternalizable Schnittstelle eingeführt, und das reparierte es.

public function readExternal(input:IDataInput):void 
    { 
     var hashCount:int = input.readInt(); 

     for (var i:int = 0;i<hashCount;i++) 
     { 
      var prop:Object = input.readObject(); 
      var val:Object = input.readObject(); 

      putEntry(prop,val); 
     } 
    } 

    public function writeExternal(output:IDataOutput):void 
    { 
     output.writeInt(collection.length); 

     for (var prop:Object in hash) 
     { 
      output.writeObject(prop); 

      output.writeObject(hash[prop]); 
     } 
    } 

Alles wird gespeichert und kommt richtig getippt. Die gespeicherten Objekte müssen entweder native Klassen (wie String) sein oder einen Aufruf [RemoteClass] metadata tag/registerClassAlias ​​() haben. Aber ansonsten funktioniert es.

+0

Das hat wahrscheinlich einen upmod verdient :) Ich hatte einige echte Probleme mit der Serialisierung in ActionScript, hauptsächlich aufgrund der Tatsache, dass die entsprechende Klasse nicht in die SWF kompiliert wurde (nur mit einem Cast), es wurde sehr verwirrend für eine Weile. – inferis

Verwandte Themen