Flash/Flex: Възможно ли е да се кодира речник с AMF?

Както подсказва заглавието, възможно ли е да се използва AMF за кодиране/декодиране на речници (без подкласове, т.е.)?

Например, ето един тестов случай:

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'
}

person David Wolever    schedule 22.04.2010    source източник


Отговори (2)


Може да мислите прекалено много. Използвам Object вместо Dictionary и той автоматично се кодира с помощта на AMF. Използвам pyamf през цялото време, за да предавам обекти/диктове и винаги е работил без никакви умствени усилия от моя страна. Никога не ми се е налагало ръчно да сериализирам/десериализирам нещо

person Jason Spitkoski    schedule 23.04.2010
comment
Вярно е, че Objects работят добре - но класът Dictionary е различен от Object. Обектите могат да имат само низове като ключове, докато речниците могат да имат произволен обект. - person David Wolever; 23.04.2010

Ключовете в Dictionary също трябва да могат да се сериализират.

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

Тест:

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]);
}

Изход:

Foo
Hello
person Vince    schedule 13.10.2011
comment
uuhh… Не съм сигурен къде сте тествали това, но когато го стартирам, редът var d2:Dictioanry = … повдига TypeError, защото ba.readObject() връща Object, а не Dictionary. - person David Wolever; 13.10.2011