使用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。
下载源文件:
- 文章ID:363
- 原文作者:zrong
- 原文链接:https://blog.zengrong.net/post/general-deep-object-copies-with-bytearray/
- 版权声明:本作品采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可,非商业转载请注明出处(原文作者,原文链接),商业转载请联系作者获得授权。