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

本文介绍如何利用ActionScript 3中的ByteArray类实现对象的深度拷贝,包括基本原理及测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

ActionScript代码:

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

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

ActionScript代码:

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

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

importflash.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类型丢失了
functionclone($source:Object):*
{
var _copier:ByteArray=new ByteArray();
_copier.writeObject($source);
_copier.position=0;
return_copier.readObject();
}
MyClass.as的内容

package{
public classMyClass{
public var a:int=1;
public var b:int=2;
public functionMyClass(){}
}
}
注意:
不能为aaa2强制转换类型,如果使用下面的语句:

var aaa2 = MyClass(clone(aaa1));
则会报错:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值