Actionscript 3 对复杂类使用SharedObject

Actionscript 3 对复杂类使用SharedObject,actionscript-3,flash,shared-objects,Actionscript 3,Flash,Shared Objects,我知道如果我想用SharedObject存储自定义类,我必须使用registerClassAlias registerClassAlias("MyClass", MyClass); sharedObject.data.myObject = new MyClass(); 但在我的例子中,我有一个自定义类,其字段本身就是自定义类的实例。如何在加载数据时以恢复类型的方式存储数据 具体来说,所讨论的类是一个包含对象数组的Graph类。这不是实际的代码,只是一个概述: class Graph {

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

registerClassAlias("MyClass", MyClass);
sharedObject.data.myObject = new MyClass();
但在我的例子中,我有一个自定义类,其字段本身就是自定义类的实例。如何在加载数据时以恢复类型的方式存储数据

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

class Graph {
    public var vertices : Array;
}
我有这个Graph类的一个实例,我用另一个类的实例(称为Node)填充它的顶点字段。我需要以以下方式存储此Graph实例:

将其恢复为图形实例。 访问此恢复实例的顶点字段,然后作为节点类型访问该数组的元素。
我尝试过在适当的位置抛出一些registerClassAliasNode,但没有任何效果。有什么方法可以做到这一点吗?

对于像这样更复杂的数据,最好的办法是对要存储在SharedObject中的对象手动定义加载和保存方法。这些方法将定义应该保存的数据,尽可能简化,并将其整理成您选择的格式,如JSON

在本例中,图形可能有一个保存方法,如下所示:

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);
}
然后是这样的加载函数:

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

它可以工作,但您必须添加序列化方法,以便恢复/存储必须使用的类状态。JSON.encode和JSON.decode方法到底是什么?我在地图上找不到他们的任何参考资料。事实上,这是行不通的。我使用的是flash CS5,它不支持JSON API。有没有办法手动执行此操作?@JackM您可以在较旧版本的Flash Player中使用。JSON也是我在示例中使用的数据格式-您可以轻松地将其更改为XML甚至您自己的数据格式。@JackM如果是这种情况,您可能应该编写自己的答案,详细说明您所做的事情,并接受它。不,您答案的重要部分是建议滚动我自己的加载/保存代码,这就是我所接受的。