Правильная сериализация 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 сбрасывается, я получаю еще одну копию данных (с уникальным ключом в словаре).
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 (). Но кроме этого, это работает.