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

本站原创文章,转载请注明: 转载自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 代码:

?View Code ACTIONSCRIPT
function clone(source:Object):* {
var copier:ByteArray = new ByteArray();
copier.writeObject(source);
copier.position = 0;
return(copier.readObject());
}

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

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

ActionScript 代码:

?View Code ACTIONSCRIPT
newObjectCopy = clone(originalObject);

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

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

?View Code ACTIONSCRIPT
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的内容

?View Code ACTIONSCRIPT
package{
public class MyClass{
public var a:int = 1;
public var b:int = 2;
public function MyClass(){}
}
}

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

?View Code ACTIONSCRIPT
var aaa2 = MyClass(clone(aaa1));

则会报错:

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

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

下载源文件:
deep-object-copies-with-bytearray.zip(5KB)


发表评论


请输入上面的验证码