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)


Возможно, вы слишком много думаете. Я использую объект вместо словаря, и он автоматически кодируется с использованием AMF. Я все время использую pyamf для передачи объектов/слов, и это всегда работало без каких-либо умственных усилий с моей стороны. Мне никогда не приходилось вручную сериализовать/десериализовать что-либо

person Jason Spitkoski    schedule 23.04.2010
comment
Это правда, что объекты работают хорошо, но класс 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
эээ... не знаю, где вы это проверяли, но когда я запускаю его, строка var d2:Dictioanry = … вызывает TypeError, потому что ba.readObject() возвращает Object, а не Dictionary. - person David Wolever; 13.10.2011