Правильная сериализация flash.utils.Dictionary в SharedObject

У меня есть класс удобной коллекции в моем проекте Flex под названием HashMap, который по сути является оболочкой для flash.utils.Dictionary с набором удобных методов и добавленным (синхронизированным) ArrayCollection, чтобы я мог передать HashMap привязываемым элементам управления, которые хотят Коллекция 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 сбрасывается, я получаю еще одну копию данных (с уникальным ключом в Словаре).


person Jason Maskell    schedule 11.05.2009    source источник


Ответы (1)


Я немного повозился с этим и получил много глупых результатов, пытаясь позволить сериализации «просто работать», поэтому я, наконец, просто реализовал интерфейс 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 ​​(). Но в остальном это работает.

person Jason Maskell    schedule 12.05.2009
comment
Это, вероятно, заслуживает апмода :) У меня были некоторые реальные проблемы с сериализацией в ActionScript, в основном из-за отсутствия соответствующего класса, скомпилированного в SWF (просто использование приведения не включает его), это немного сбивало с толку . - person inferis; 12.05.2009