使用ByteArray进行对象深度拷贝-ActionScript3 Tips and Tricks

本文是ActionScript3 Tips and Tricks系列阅读笔记之一“Deep Object Copies with ByteArray”,这里是原文地址

使用ActionScript3中新提供的 ByteArray类(flash.utils.ByteArray)可以创建一个对象的深度拷贝。“深度”的意思是可以拷贝一个对象(object)的所有引用,这意味着如果你拷贝一个包含对象的数组,那么数组中的对象也被拷贝(而不是引用)。下面是一个clone方法:

1function clone(source:Object):* {
2var copier:ByteArray = new ByteArray();
3copier.writeObject(source);
4copier.position = 0;
5return(copier.readObject());
6}

注意:你需要先导入 flash.utils.ByteArray

要使用这个方法,可以使用下面的代码:

1newObjectCopy = clone(originalObject);

虽然这个方法可以深度拷贝你的对象,但是它不会一同拷贝类的类型定义。所以,如果查需要拷贝一个MyClass实例,拷贝出的对象将不在是MyClass类型。这个方法最好在普通对象上使用。

下面是我的一些测试代码:

 1import flash.utils.ByteArray;
 2flash.utils.getQualifiedClassName;
 3var a1:Array = [1,2,3];
 4var a2:Array = clone(a1);   //克隆a1,a2中保存的是a1的复制品,与a1不存在任何关系了
 5var a3:Array = a1;  //由于a1是数组,所以a3是引用a1
 6a1.push(4);     //改变a1的值
 7trace(a1);      //输出 1,2,3,4
 8trace(a2);      //输出 1,2,3
 9trace(a3);      //输出 1,2,3,4
10trace("===============");
11var aa1:Array = [1,2,3];
12var aa2:Array = [11,22,aa1] //aa2中的一个元素是aa1
13var aa3:Array = clone(aa2); //克隆aa2,aa3中保存的是aa2的复制品,aa2中的aa1也是复制品
14trace(aa1);         //输出 1,2,3
15trace(aa2);         //输出 11,22,1,2,3
16aa1.push(4);            //修改aa1的值
17trace(aa2);         //输出 11,22,1,2,3,4
18trace(aa3);         //输出 11,22,1,2,3
19trace(getQualifiedClassName(aa2));  //输出 Array
20trace(getQualifiedClassName(aa3));  //输出 Array,这说明对Array的克隆可以保持克隆结果的Array类型不变
21trace("===============");
22var aaa1:MyClass = new MyClass();   //建立一个自定义类型
23var aaa2 = clone(aaa1);     //克隆自定义类型
24trace(aaa2.a);          //输出 1
25trace(getQualifiedClassName(aaa2)); //输出 Object,这说明aaa2的MyClass类型丢失了
26function clone($source:Object):*
27{
28var _copier:ByteArray = new ByteArray();
29_copier.writeObject($source);
30_copier.position = 0;
31return _copier.readObject();
32}

MyClass.as的内容

1package{
2public class MyClass{
3public var a:int = 1;
4public var b:int = 2;
5public function MyClass(){}
6}
7}

注意:

不能为aaa2强制转换类型,如果使用下面的语句:

1var aaa2 = MyClass(clone(aaa1));

则会报错:

1TypeError: Error #1034: 强制转换类型失败:无法将 Object@138c0341 转换为 MyClass
2at DeepObjectCopieswithByteArray_fla::MainTimeline/DeepObjectCopieswithByteArray_fla::frame1()

如果使用as语句转换,则得到的aaa2值是null。

下载源文件:

1 文件