2013-07-12 1 views
1

Je crée une application Adobe AIR et je stocke un dictionnaire dans mon SharedObject. Quelque chose dans le sens de ce qui est mentionné here.Longueur de la propriété de mon dictionnaire sérialisé à stocker dans un SharedObject

Mais pourquoi la longueur de mon dictionnaire est-elle toujours nulle? Je finis par devoir suivre manuellement la longueur qui semble fonctionner mais ne me remplit pas de confiance.

Aussi, quelqu'un peut-il expliquer quand exactement readExternal et writeExternal sont appelés? Je trouve qu'ils sont appelés plusieurs fois (pour ce qui me semble inutile). Comme c'est un dictionnaire, l'ajout de la même valeur plusieurs fois ne pose pas de problème mais encore une fois, je me demande si j'ai mis quelque chose de mal ici pour déclencher cela.

C'est ce que j'ai un

public class SharedObjectDictionary implements IExternalizable { 

private var _dictionary:Dictionary; 
private var _length:int; 

public function addItem and removeItem 
{ 
... just adds/removes to my _dictionary ... 
... and keeps track of the length ... 
} 

public function readExternal(input:IDataInput):void 
{ 
    var count:int = input.readInt(); 
    for (var i:Number = 0;i<count;i++) 
    { 
     var key:String = input.readObject(); 
     var val:String = input.readObject(); 

     addItem(key,val); 
    } 
} 

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

    for (var key:Object in dictionary) 
    { 
     output.writeObject(key); 
     output.writeObject(dictionary[key]); 
    } 
} 

}

Quand je fais l'appel à stocker ce SharedObject en tant que tels

var so:SharedObject = SharedObject.getLocal("xxxx"); 
    so.data["xxxxx"] = instance of the SharedObjectDictionary above; 
    so.flush(); 
    so.close(); 
    so = null; 

Je trouve que readExternal est appelée une fois et writeExternal obtient appelé 3 fois.

Merci!

Répondre

0

La longueur de votre Dictionary est toujours null car le Dictionary ne définit pas une telle propriété. Si vous avez essayé d'accéder à une propriété qui n'existe pas dans une autre classe, vous obtiendrez une erreur de compilation. Mais puisque la classe Dictionary est dynamic, aucune erreur de compilation ne se produira. La seule solution est de garder une trace de la longueur vous-même.

Je ne peux pas commenter votre autre question à propos de readExternal/writeExternal ... avez-vous un code que vous pouvez montrer qui démontre cela?

+0

ah a donc du sens pour le null! Voir ma question éditée avec plus de code démontrant ce que je fais. –

+1

Juste un conseil: j'aime vraiment le 'LinkedMap' trouvé dans le paquetage as3commons-collection [as3commons.org] (http://www.as3commons.org). Il s'agit essentiellement d'une combinaison d'un dictionnaire et d'un tableau, de sorte que la "longueur" - avec beaucoup d'autres choses utiles - est déjà prise en compte. –

+0

sympa, merci T. –

Questions connexes