正确地将flash.utils.Dictionary序列化为SharedObject

Jas*_*ell 3 apache-flex flash serialization shared-objects

我在我的Flex项目中有一个名为HashMap的便捷集合类,它本质上是flash.utils.Dictionary的包装器,带有一堆便捷方法和一个添加的(同步的)ArrayCollection,这样我就可以将HashMap传递给想要的可绑定控件了一个ArrayCollection.一切正常.

什么是不行的,我刚才发现,将HashMap放在本地的SharedObject中.

注册该类会导致它被存储并以正确的类型返回,并且ArrayCollection成员返回正常,但是Dictionary不存储其数据.

这是一个片段:

[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();
Run Code Online (Sandbox Code Playgroud)

这就是相关的东西.让字典正确存储的过程是什么?我实际上必须使ArrayCollection瞬态,就像现在每次刷新SO时,我得到另一个(在Dictionary中唯一键入)数据的副本.

Jas*_*ell 10

我更多地修改了这个,并且尝试让序列化"正常工作"得到了很多愚蠢的结果,所以我最终实现了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]);
        }
    }
Run Code Online (Sandbox Code Playgroud)

一切都被存储并且正确输入.存储的对象必须是本机类(如String),或者具有[RemoteClass]元数据标记/ registerClassAlias()调用.但除此之外,它有效.