as3中通过ByteArray进行对象的深度拷贝

本文深入探讨了ActionScript 3 (AS3) 中对象深度拷贝的方法,利用ByteArray进行复制,并通过实例展示了复制过程及注意事项。特别强调了在处理对象时,仅使用复制对象代码片段是不足以实现深度复制的,需要配合registerClassAlias方法来恢复类的类型信息。同时,提供了针对不同场景的代码示例,包括数组和自定义类的深度复制。
摘要由CSDN通过智能技术生成

今天同事问我有as3中对象深度拷贝的问题

原来还真是没用过,今天google后自己总结下,便于大家参考

as3中通过ByteArray可以进行对象的深度拷贝

Java代码   收藏代码
  1. import flash.utils.ByteArray;  
  2. import flash.utils.getQualifiedClassName;  
  3. import flash.net.*;  
  4. import src.*;  
  5. function cloneObject(source:Object) :* {  
  6. var typeName:String = getQualifiedClassName(source);//获取全名  
  7. trace(”输出类的结构”+typeName);  
  8. //return;  
  9. var packageName:String = typeName.split(”::”)[0];//切出包名  
  10. trace(”类的名称”+packageName);  
  11. var type:Class = getDefinitionByName(typeName) as Class;//获取Class  
  12. trace(type);  
  13. registerClassAlias(packageName, type);//注册Class  
  14. //复制对象  
  15. var copier:ByteArray = new ByteArray();  
  16. copier.writeObject(source);  
  17. copier.position = 0;  
  18. return copier.readObject();  
  19. }  
 

有的人说用复制对象那一段不就可以了吗,但是实际上行不通
对于数组深度复制来说, 复制对象的后面4句代码就足够了

Java代码   收藏代码
  1. var a1:Array=[1,2,3];  
  2. var a2:Array =cloneObject(a1);  
  3. var a3:Array = a1;  
  4. a1.push(”youmila”);  
  5. trace(”a1:”+a1+”a2:”+a2+”a3″+a3);  
 

但是对于对象来说肯定不行

用列子测试下
src.youmila.as 代码:

Java代码   收藏代码
  1. package src{  
  2. public class youmila{  
  3. private var $_name:String =”youmila”;  
  4. private var $_num:Number =0;  
  5. public function youmila():void{  
  6. trace($_name);  
  7. }  
  8. public function secondFunc():void{  
  9. $_num++;  
  10. trace(”this a called function $_num::”+$_num);  
  11. }  
  12. }  
  13. }  
 

yapollo.as 代码:

Java代码   收藏代码
  1. package {  
  2. public class yapollo{  
  3. private var $_name:String =”yapollo”;  
  4. public var $_num:Number =0;  
  5. public function yapollo():void{  
  6. trace($_name);  
  7. }  
  8. public function secondFunc():void{  
  9. $_num++;  
  10. trace(”this a called function $_num::”+$_num);  
  11. }  
  12. }  
  13. }  
 

测试实例

var uml1:youmila = new youmila();
var uml2 = cloneObject(uml1);
trace(”类型”+getQualifiedClassName(uml2)); 
输出结果:

youmila
类型Object 
原来的对象类型丢失了,所以对于对象而言,四行不够,必须
用registerClassAlias来保存类的别名,以用于丢失后恢复类的类型
测试实例

Java代码   收藏代码
  1. var uml1:youmila = new youmila();  
  2. var uml2 = cloneObject(uml1);  
  3. trace(”类型”+getQualifiedClassName(uml2));  
  4. var apollo:yapollo = new yapollo();  
  5. apollo.secondFunc();  
  6. var apollo2 = cloneObject(apollo);  
  7. trace(”第一次输出复制对象的$_num值”+apollo2.$_num);  
  8. trace(”类型”+getQualifiedClassName(apollo2));  
  9. apollo2.secondFunc();  
  10. trace(”第二次输出复制对象的$_num值”+apollo2.$_num);  
 

输出结果:

youmila
输出类的结构src::youmila
类的名称src
[class youmila]
youmila
类型src::youmila
yapollo
this a called function $_num::1
输出类的结构yapollo
类的名称yapollo
[class yapollo]
yapollo
第一次输出复制对象的$_num值1
类型yapollo
this a called function $_num::2
第二次输出复制对象的$_num值2 


还有一种方法:flex (as3)中 ObjectUtil.copy 拷贝对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值