AS3:如何深度复制对象

时间:2014-05-24 04:40:53

标签: actionscript-3 flash object actionscript air

我有一个对象需要复制到我的SharedObject数据。 问题是共享对象的数据属性是只读的,所以我不能克隆我的源#39;对象并将其分配给共享对象数据,我必须以这种方式复制它们:

var so: SharedObject = SharedObject.getLocal("appData");
copyObject(sourceObj, so.data);
so.flush();

和复制方法:

public static function copyObject(sourceObject:Object, destinationObject:Object):void{
    // this would be the code that i need
}

另外请记住,我的对象具有对象属性,因此它具有 n 对象内部。这就是为什么我不能简单地为每个人创建一个并在第一级分配所有属性,所以我需要的是制作一个DEEP副本,可能是递归的。我试了几个小时来制作这个copyObject方法但没有成功。我也在互联网上搜索过,但我找不到任何适合我的对象副本。

有人可以用这种方法帮助我吗?我真的很感激它!

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

解决方案是将对象写入字节数组,将其编码为字符串(可选 - 您也可以保存字节数组,但未查找)并将其保存到共享对象中。

此函数将获取一个对象并将其转换为字符串

public static function serializeToString(value:Object):String{
                        if(value==null){
                            throw new Error("null isn't a legal serialization candidate");
                        }

                        var bytes:ByteArray = new ByteArray();
                        bytes.writeObject(value);
                        bytes.position = 0;
                        return Base64.encodeByteArray(bytes);
}

这个会从一个字符串中取回你的对象。

public static function readObjectFromStringBytes(value:String):Object{

              var result:ByteArray =   Base64.decodeToByteArray( value) as ByteArray;
                  result.position = 0;
                  return result.readObject();

                } 

您可以在此处找到Base 64编码类https://github.com/juancgarcia/screenshotify/blob/master/Downloadify-652377f/src/com/dynamicflash/util/Base64.as

答案 1 :(得分:1)

您需要对要以这种方式存储的所有对象实施IExternalizable。该实现包括在执行writeExternal时调用ByteArray的writeObject()方法,以及针对新创建的实例调用的readExternal方法,因此您的类应该编写必要的元数据,以使您的对象深度克隆,包括编写属性对象。

Manual on IExternalizable

在旁注中,您不应该在整个so.data中存储一个对象,您最好在so.data中指定一个字段并将对象副本填入其中。

答案 2 :(得分:1)

对于复杂对象,我会使用RegisterClassAlias:

import flash.net.registerClassAlias;
registerClassAlias("YourClassName", YourClassName);
var so:SharedObject = SharedObject.getLocal("objectName");
so.data.yourData = YourClassName.instance;
so.flush();

对于具有深层次简单数据的简单对象类型(包括数组的基元),我只需在回读数据时使用JSON.stringify()和JSON.parse()。