Правильная сериализация flash.utils.Dictionary в SharedObject - PullRequest
3 голосов
/ 12 мая 2009

В моем проекте Flex есть вспомогательный класс коллекции, называемый HashMap, который, по сути, является оболочкой для flash.utils.Dictionary со множеством вспомогательных методов и добавленной (синхронизированной) коллекцией ArrayCollection, чтобы я мог передать HashMap в bindable. элементы управления, которые хотят ArrayCollection. Это все отлично работает.

То, что не работает нормально, я выясняю только сейчас, помещает этот HashMap в локальный SharedObject.

Регистрация класса приводит к тому, что он сохраняется и возвращается как правильный тип, и член ArrayCollection возвращается просто отлично, но Словарь не хранит его данные ..

Вот фрагмент:

[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();

Так что это актуальный материал. Какая процедура для того, чтобы этот словарь правильно сохранял себя? Я на самом деле должен сделать переход ArrayCollection, так как сейчас, каждый раз, когда SO сбрасывается, я получаю другую копию (с уникальным ключом в словаре) данных.

1 Ответ

10 голосов
/ 12 мая 2009

Я возился с этим еще немного и получил множество глупых результатов, пытаясь позволить сериализации «просто работать», поэтому я наконец-то просто реализовал интерфейс IExternalizable, и это исправило его.

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

Все запоминается и попадает правильно напечатанным. Сохраняемые объекты должны быть либо собственными классами (например, String), либо иметь вызов тега метаданных [RemoteClass] / registerClassAlias ​​(). Но кроме этого, это работает.

...