AS3使用ByteArray进行对象深度拷贝

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

ActionScript代码:

functionclone(source:Object):*{
varcopier:ByteArray=newByteArray();
copier.writeObject(source);
copier.position=0;
return(copier.readObject());
}
注意:你需要先导入flash.utils.ByteArray;

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

ActionScript代码:

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

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

importflash.utils.ByteArray;
flash.utils.getQualifiedClassName;
vara1:Array=[1,2,3];
vara2:Array=clone(a1);//克隆a1,a2中保存的是a1的复制品,与a1不存在任何关系了
vara3: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("===============");
varaa1:Array=[1,2,3];
varaa2:Array=[11,22,aa1]//aa2中的一个元素是aa1
varaa3: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("===============");
varaaa1:MyClass=newMyClass();//建立一个自定义类型
varaaa2=clone(aaa1);//克隆自定义类型
trace(aaa2.a);//输出1
trace(getQualifiedClassName(aaa2));//输出Object,这说明aaa2的MyClass类型丢失了
functionclone($source:Object):*
{
var_copier:ByteArray=newByteArray();
_copier.writeObject($source);
_copier.position=0;
return_copier.readObject();
}
MyClass.as的内容

package{
publicclassMyClass{
publicvara:int=1;
publicvarb:int=2;
publicfunctionMyClass(){}
}
}

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

varaaa2=MyClass(clone(aaa1));

则会报错:

TypeError:Error#1034:强制转换类型失败:无法将Object@138c0341转换为MyClass。
atDeepObjectCopieswithByteArray_fla::MainTimeline/DeepObjectCopieswithByteArray_fla::frame1()
如果使用as语句转换,则得到的aaa2值是null

你可能感兴趣的:(Flash,actionscript)