本站原创文章,转载请注明: 转载自zrong's Blog,原文 使用ByteArray进行对象深度拷贝-ActionScript3 Tips and Tricks,欢迎使用文章源码进行转载。
本站转载文章会标明[转],转载请注明原始作者文章地址。
本文是ActionScript3 Tips and Tricks系列阅读笔记之一“Deep Object Copies with ByteArray”,这里是原文地址。
使用ActionScript3中新提供的 ByteArray类 (flash.utils.ByteArray) 可以创建一个对象的深度拷贝。“深度”的意思是可以拷贝一个对象(object)的所有引用, 这意味着如果你拷贝一个包含对象的数组,那么数组中的对象也被拷贝(而不是引用)。下面是一个clone方法:
ActionScript 代码:
function clone(source:Object):* { var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return(copier.readObject()); } |
注意:你需要先导入 flash.utils.ByteArray;
要使用这个方法,可以使用下面的代码:
ActionScript 代码:
newObjectCopy = clone(originalObject); |
虽然这个方法可以深度拷贝你的对象,但是它不会一同拷贝类的类型定义。所以,如果查需要拷贝一个 MyClass 实例,拷贝出的对象将不在是MyClass类型。这个方法最好在普通对象上使用。
下面是我的一些测试代码:
import flash.utils.ByteArray; flash.utils.getQualifiedClassName; var a1:Array = [1,2,3]; var a2:Array = clone(a1); //克隆a1,a2中保存的是a1的复制品,与a1不存在任何关系了 var a3:Array = a1; //由于a1是数组,所以a3是引用a1 a1.push(4); //改变a1的值 trace(a1); //输出 1,2,3,4 trace(a2); //输出 1,2,3 trace(a3); //输出 1,2,3,4 trace("==============="); var aa1:Array = [1,2,3]; var aa2:Array = [11,22,aa1] //aa2中的一个元素是aa1 var aa3:Array = clone(aa2); //克隆aa2,aa3中保存的是aa2的复制品,aa2中的aa1也是复制品 trace(aa1); //输出 1,2,3 trace(aa2); //输出 11,22,1,2,3 aa1.push(4); //修改aa1的值 trace(aa2); //输出 11,22,1,2,3,4 trace(aa3); //输出 11,22,1,2,3 trace(getQualifiedClassName(aa2)); //输出 Array trace(getQualifiedClassName(aa3)); //输出 Array,这说明对Array的克隆可以保持克隆结果的Array类型不变 trace("==============="); var aaa1:MyClass = new MyClass(); //建立一个自定义类型 var aaa2 = clone(aaa1); //克隆自定义类型 trace(aaa2.a); //输出 1 trace(getQualifiedClassName(aaa2)); //输出 Object,这说明aaa2的MyClass类型丢失了 function clone($source:Object):* { var _copier:ByteArray = new ByteArray(); _copier.writeObject($source); _copier.position = 0; return _copier.readObject(); } |
MyClass.as的内容
package{ public class MyClass{ public var a:int = 1; public var b:int = 2; public function MyClass(){} } } |
注意:
不能为aaa2强制转换类型,如果使用下面的语句:
var aaa2 = MyClass(clone(aaa1)); |
则会报错:
TypeError: Error #1034: 强制转换类型失败:无法将 Object@138c0341 转换为 MyClass。 at DeepObjectCopieswithByteArray_fla::MainTimeline/DeepObjectCopieswithByteArray_fla::frame1() |
如果使用as语句转换,则得到的aaa2值是null。
下载源文件:
deep-object-copies-with-bytearray.zip(5KB)


最新评论