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

  • 本站文章除注明转载外,均为本站原创或者翻译。
  • 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
  • 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
  • 本博客采用 WPCMD 维护;
  • 本文标题:使用ByteArray进行对象深度拷贝-ActionScript3 Tips and Tricks
  • 本文链接:http://zengrong.net/post/363.htm

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

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

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

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

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

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 (5.2 KiB, 1,265 hits)