将SharedObject与复杂的类一起使用

时间:2014-01-02 05:57:18

标签: actionscript-3 flash shared-objects

我知道如果我想用SharedObject存储自定义类,我必须使用registerClassAlias。

registerClassAlias("MyClass", MyClass);
sharedObject.data.myObject = new MyClass();

但就我而言,我有一个自定义类,其字段本身就是自定义类的实例。如何以加载数据时恢复类型的方式存储它?

具体来说,有问题的类是一个Graph类,它包含一个对象数组。这不是实际的代码,只是一个概述:

class Graph {
    public var vertices : Array;
}

我有一个这个Graph类的实例,我正在用vertices字段填充另一个类的实例,名为Node。我需要以这样的方式存储这个Graph实例:

  1. 将其恢复为图形实例。
  2. 访问此已恢复实例的vertices字段,然后以Node类型访问该数组的元素。
  3. 我试过在适当的地方投掷一些registerClassAlias("Node", Node),但它没有任何效果。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

对于更复杂的数据,最好的办法是在要存储在SharedObject中的对象上手动定义load()save()方法。这些方法将定义应保存哪些数据,尽可能简化,并将其整理为您选择的格式,如JSON。

在此示例中,您的Graph可能有save()方法,如下所示:

public function save(name:String, sharedObject:SharedObject):void
{
    var list:Array = [];
    for each(var node:Node in vertices)
    {
        // Add a simple object defining the important Node properties
        // to the array we will save as JSON.
        list.push({ x: node.x, y: node.y });
    }

    sharedObject.data[name] = JSON.encode(list);
}

然后是load()函数,如下所示:

public function load(name:String, sharedObject:SharedObject):void
{
    // Empty current list of vertices.
    vertices = [];

    var list:Array = JSON.decode(sharedObject.data[name]);
    for each(var def:Object in list)
    {
        // Create real Node from simpler definition.
        var node:Node = new Node();

        node.x = def.x;
        node.y = def.y;
        vertices.push(node);
    }
}

将使用如下:

existingGraph.save('myGraph', sharedObject);

var newGraph:Graph = new Graph();
newGraph.load('myGraph', sharedObject);