2010-04-22 8 views
0

Comme le suggère le titre, est-il possible d'utiliser AMF pour encoder/décoder des dictionnaires (sans sous-classe, c'est-à-dire)?Flash/Flex: Est-il possible d'encoder le dictionnaire en utilisant AMF?

Par exemple, voici un test:

function serializeAndReload(obj:*):* { 
    var serialized:ByteArray = new ByteArray(); 
    serialized.writeObject(obj); 
    serialized.position = 0; 
    return serialized.readObject(); 
} 

function test():void { 
    var d:Dictionary = new Dictionary(); 
    d[{}] = 42; 
    d[d] = true; 
    var x:* = serializeAndReload(d); // <<< x is an instance of Object 
    trace(x['[object Object]']); // <<< traces '42' 
} 

Répondre

0

Vous pouvez être trop penser. J'utilise Object à la place de Dictionary et il est automatiquement encodé en utilisant AMF. J'utilise pyamf tout le temps pour passer des objets/dicts autour et c'est toujours travaillé sans aucun effort mental de ma part. Je n'ai jamais eu besoin de sérialiser/désérialiser manuellement quoi que ce soit

+0

Il est vrai que les objets fonctionnent bien - mais la classe Dictionary est différent de l'objet. Les objets ne peuvent avoir que des chaînes comme clés, alors que les dictionnaires peuvent avoir n'importe quel objet. –

0

Les clés du Dictionary doivent également être sérialisables.

[RemoteClass(alias="Foo")] 
public class Foo 
{ 
} 

Test:

var d:Dictionary = new Dictionary(); 
var f:Foo = new Foo(); 
d[f] = "Hello"; 
var ba:ByteArray = new ByteArray(); 
ba.writeObject(d); 
ba.position = 0; 
var d2:Dictionary = Dictionary(ba.readObject()); 
for (var key:* in d2) 
{ 
    trace(getQualifiedClassName(key)); 
    trace(d2[key]); 
} 

Sortie:

Foo 
Hello 
+1

uuhh ... Je ne sais pas où vous avez testé cela, mais quand je l'exécute, la ligne 'var d2: Dictioanry = ...' soulève un 'TypeError' car' ba.readObject() 'retourne un' Object', pas un 'Dictionary'. –