AS3: How to Deep Copy an Object

爷,独闯天下 提交于 2019-12-25 01:45:48

问题


i have an object that i need to copy to my SharedObject data. The problem is that the data property of shared object is read-only, so i can't clone my 'source' object and assign it to the shared object data, i have to make a copy of them in this way:

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

and the copy method:

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

Also have in mind that my object has properties that are objects, so it has inside n leves of objects. That is why i can't simply make a for each and assign all properties on the first level, so what i need is to make a DEEP copy, probably recursive. I tried for hours to make this copyObject method with no success. Also i've searched on the internet but i didn't find any object copy that suits me.

Can someone please help me with this method? I would really apreciate it!

Thank you for your help!


回答1:


The solution is to write your object to a byte array, encoded it to a string(optional - you can probably save the byte array as well, haven't looked it up) and save it to your shared object.

This function will take an object and turn it into a string

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

This one will get your object back from a string.

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

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

                } 

The Base 64 encoding class you can find here https://github.com/juancgarcia/screenshotify/blob/master/Downloadify-652377f/src/com/dynamicflash/util/Base64.as.




回答2:


You need to implement IExternalizable on all objects you want to store this way. The implementation includes making writeExternal method called against a ByteArray when you do writeObject(), and readExternal methods, that's called against a newly created instance, so your class should write the necessary metadata in order to make your object deep-cloned, including writing property objects.

Manual on IExternalizable

And on a side note, you should not store one object in the entire so.data, you'd better assign a field in so.data and stuff your object copy in there.




回答3:


For complex objects I would use RegisterClassAlias:

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

For simple Object type with deep level of simple data (primitives including arrays) I would simply use JSON.stringify() and JSON.parse() when reading back the data.



来源:https://stackoverflow.com/questions/23841384/as3-how-to-deep-copy-an-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!