`
windmark
  • 浏览: 32186 次
社区版块
存档分类
最新评论

AS3 深复制

    博客分类:
  • Flex
 
阅读更多

13.11 深度拷贝一个ArrayCollection集合
13.11.1 问题
需要拷贝一个索引数组里的所有项或者从一个对象创建一个新对象。
13.11.2解决
使用mx.utils.ObjectUtil.copy方法
13.11.3讨论
正如演示那样,copy一个对象仅仅是为新对象创建了一个指针。意味着对第一个对象值的任何改变都会反映到第二个对象上。
var objOne:Object =
{name:"foo", data:{first:"1", second:"2"}};
var objTwo = objOne;
objOne.data.first = "4";
trace(objTwo.data.first);//traces 4

相反如果我们想要copy一个对象的全部到另一个对象中,使用mx.utils.ObjectUtil类的copy方法。该方法接受一个对象做为参数而返回一个在内存的新位置的此对象的深度拷贝。
这就意味着该对象的任何属性被copy而不再是引用原始对象相同位置的属性。如下使用此方法:
var objTwo = mx.utils.ObjectUtil.copy(objOne);
此copy方法工作机制是通过原对象创建一个ByteArray,然后再把ByteArray写入一个新对象,如下所示:
var ba:ByteArray = new ByteArray();
ba.writeObject(objToCopy);
ba.position = 0;
var objToCopyInto:Object = ba.readObject();
return objToCopyInto;

这样原来的例子就可以如期的执行:
var objOne:Object = {name:"foo", data:{first:"1", second:"2"}};
var objTwo = objOne;
var objThree = mx.utils.ObjectUtil.copy(objOne);
objOne.data.first = "4";
trace(objTwo.data.first);//traces 4
trace(objThree.data.first);//traces 1, which is the original value
为了copy一个特定类型的对象为一个新对象存在一定难度。下面的代码会抛出一个错误:
var newFoo:Foo = ObjectUtil.copy(oldFoo) as Foo;
Flash Player并不知道如何把ByteArray转换为指定的类型。通过ByteArray,对象被序列化为AMF 二进制数据,这种方式和Flash Remoting中的一致。
为了反序列化此数据对象,该类型必须通过flash.net.registerClassAlias方法向Flash Player注册。此方法注册该类,以便该类的实例对象都可以从二进制反序列化回原对象。
registerClassAlias 需要2个参数:
public function registerClassAlias(aliasName:String, classObject:Class):void
第一个参数是此类的全类名,第二个参数是类型为Class的一个对象。全类名就是类似如下的mx.containers.Canvas or com.oreilly.cookbook.Foo.
在这里的例子中,拷贝对象时既不知道全类名也不知道该类的一个引用。幸运的是,flash.utils.getQualifiedClass会返回参数传入的对象的全类名,而flash.utils.getDefinitionByName
返回传入的对象的类引用。通过使用这2个方法,你可以注册任何对象的类:
private function copyOverObject(objToCopy:Object, registerAlias:Boolean = false):Object
{
if(registerAlias) {
var className:String = flash.utils.getQualifiedClassName(objToCopy);
flash.net.registerClassAlias(className,
(flash.utils.getDefinitionByName(className) as Class));
}
return mx.utils.ObjectUtil.copy(objToCopy);
}
现在一个强类型对象的ArrayCollection就可以通过把集合中的每个对象传给copyOverObject方法正确的拷贝啦:
private function copyOverArray(arr:Array):Array {

var newArray:Array = new Array();
for(var i:int; i<arr.length; i++) {
newArray.push(copyOverObject(arr[i], true));
}
return newArray;
}
var ac:ArrayCollection = new ArrayCollection([{name:'Joseph', id:21}, foo,
{name:'Josef', id:81}, {name:'Jose', id:214}]);
var newAC:ArrayCollection = new ArrayCollection(copyOverArray(ac.source));
值得注意的是,如果仅仅是通过mx.utils.ObjectUtil.copy来拷贝这2个ArrayCollection,那么原始ArrayCollection中的所有数据也会存在于新拷贝的ArrayCollection中。但是关于每个对象的类信息将不存在,任何企图
把该集合中一个对象强制转化为某一指定类型都将导致一个错误或空值。



译者注:
1.实验代码1
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="alertObj();">
<mx:Style>
Application{fontSize:12px;}
</mx:Style>
<mx:Script>
import mx.controls.Alert;

public function alertObj():void
{
var objOne:Object ={name:"张三", data:{first:"张", second:"三"}};
var objTwo:Object = objOne;
objOne.data.first = "李";//对原始对象的修改,也会在新对象反应出来
Alert.show(objTwo.data.first);//输出 李
}
</mx:Script>
</mx:Application>


2。实验代码2--深拷贝
<?xml version="1.0" encoding="utf-8"?>
<!--对象的深度拷贝-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="alertObj();">
<mx:Style>
Application{fontSize:12px;}
</mx:Style>
<mx:Script>
import mx.controls.Alert;
import mx.utils.ObjectUtil;

public function alertObj():void
{
var objOne:Object ={name:"张三", data:{first:"张", second:"三"}};
var objTwo:Object =ObjectUtil.copy(objOne);//关键代码
objOne.data.first = "李";//对原始对象的修改,不会影响第二个
Alert.show("objOne="+objOne.data.first+"\nobjTwo="+objTwo.data.first);//
}
</mx:Script>
</mx:Application>


3.对ArrayCollection深度拷贝

<?xml version="1.0" encoding="utf-8"?>
<!--特定类对象的深度拷贝-->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="alertObj();">
<mx:Style>
Application{fontSize:12px;}
</mx:Style>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.utils.ObjectUtil;
import mx.collections.ArrayCollection;

public function alertObj():void
{
var zl:Object={name:"赵六",age:29};
var ac:ArrayCollection = new ArrayCollection([
{name:'张三', age:20},
zl,
{name:'李四', age:31},
{name:'王五', age:27}
]);
var newAC:ArrayCollection = new ArrayCollection(copyOverArray(ac.source));

//可以如下验证下
//ac[2].name = "改变";
//Alert.show(newAC[2].name);
}

//对一个对象数组深度拷贝
private function copyOverArray(arr:Array):Array {
var newArray:Array = new Array();
for(var i:int;i<arr.length; i++){
newArray.push(copyOverObject(arr[i], false));//深度拷贝每个元素
}
return newArray;
}

//对对象深度拷贝
private function copyOverObject(objToCopy:Object, registerAlias:Boolean = false):Object
{
if(registerAlias) {
var className:String = flash.utils.getQualifiedClassName(objToCopy);
flash.net.registerClassAlias(className,(flash.utils.getDefinitionByName(className) as Class));
}
return mx.utils.ObjectUtil.copy(objToCopy);
}
]]>
</mx:Script>
</mx:Application>

分享到:
评论

相关推荐

    iOS 深复制浅复制

    "深复制"和"浅复制"是两种不同的复制方式,它们在内存管理和对象引用上有着显著的区别。 首先,让我们理解“浅复制”(Shallow Copy)。浅复制是指创建一个新对象,这个新对象的指针指向的是原始对象中的数据的副本...

    23种设计模式实例及说明大全(as3语言描述)

    AS3支持浅拷贝和深拷贝,可以用于快速复制对象。 6. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。AS3中的DisplayObject容器类如Sprite和MovieClip就是组合模式的典型应用。 7. 享...

    AS 3 错误代码中文说明

    ### AS 3 错误代码中文说明 #### 1000 系统内存不足 - **描述**:此错误提示表明系统当前可用的内存不足以支持Flash Player完成代码的编译工作。通常出现在计算机资源紧张时,特别是同时运行多个大型应用或者程序时...

    flash as3 仿苹果菜单

    在本文中,我们将深入探讨如何使用Flash AS3创建一个仿苹果风格的菜单。Apple的用户界面以其优雅、直观和响应迅速而闻名,因此在Flash中实现类似的菜单效果可以帮助提升用户体验,尤其是在网页或互动应用程序中。 ...

    如何使用as复制多个影片剪辑.pdf

    "使用AS复制多个影片剪辑" 在本节中,我们将学习如何使用ActionScript(AS)复制多个影片剪辑。这个技术在Flash动画制作中非常有用,可以帮助我们快速地创建多个影片剪辑,从而提高工作效率。 一、...

    flash actionscript3 as3 DesignPattern面向对象23种设计模式的实现源代码.zip

    AS3支持浅复制和深复制,可以利用clone()方法实现。 6. **适配器模式**:将一个类的接口转换成客户期望的另一个接口。在AS3中,通过类的继承和组合实现,将不兼容的接口转化为可兼容接口。 7. **装饰器模式**:...

    AS3高手之路

    ### AS3高手之路 在《AS3高手之路》这一篇深度技术文章中,作者系统地介绍了Adobe Flash平台下的ActionScript 3(AS3)编程语言的相关知识点与实践技巧。这篇文章对于希望深入掌握AS3编程的专业人士来说是一份宝贵...

    flash as3 programming 中文官方

    文档开篇即明确了ActionScript 3.0(AS3)的版权归属Adobe Systems Incorporated,并对其使用、复制和分发做了严格的限制。随后,文档详细阐述了AS3的使用条款、版权保护、责任声明以及对图形和图像使用的警告,强调...

    as3错误代码内容.doc

    ### AS3错误代码详解 #### 1000 系统内存不足 - **描述**:此错误提示意味着系统的可用内存不足以支持Flash Player编译代码的需求。这通常发生在计算机资源紧张或者同时运行了大量程序的时候。 - **解决方法**: -...

    VB 数组的复制实例

    Dim arr(0 To 4) As Integer = {1, 2, 3, 4, 5} '声明后初始化 Dim arr(0 To 4) As Integer arr(0) = 1 arr(1) = 2 '... ``` 三、数组的复制方法 1. For循环复制 这是最基本的方式,通过遍历源数组并将元素逐个...

    AS SSD Benchmark 1.6.4237.30508

    5. **Benchmarks**:软件提供了多个基准测试,包括读取、写入、复制和删除操作,这些测试可以帮助用户全面了解硬盘在不同工作场景下的性能。 值得注意的是,AS SSD Benchmark 1.6.4237.30508版本需要在Windows XP...

    AS SSD汉化版.rar

    4. **复制测试**:此测试模拟实际文件复制过程,包括ISO、程序、文本和游戏文件的复制,可以反映出SSD在日常使用中的实际性能。 5. **压缩/解压缩速度**:这部分测试SSD在处理压缩和解压缩数据时的速度,这对于处理...

    AS SSD Bench 硬盘测试软件

    除了上述基本测试外,AS SSD Bench还提供了其他功能,如复制基准测试,模拟真实世界中的文件复制场景;以及压缩基准测试,用于考察硬盘在处理不同比例压缩数据时的性能变化。此外,软件还能显示硬盘的总写入量,帮助...

    AS_SSD_Benchmark

    5. **复制测试**:测试数据从一个位置到另一个位置的传输速度,包括程序、文件和整个驱动器的复制。 6. **压缩率测试**:检查SSD在处理压缩和非压缩数据时的性能差异,因为某些SSD使用了数据压缩技术来提高性能。 ...

    FlashAS教程:AS2.0制作加载外部.swf影片的视频播放器.pdf

    然后,读者可以复制按钮元件,命名为“play2”,并在舞台上打开后,改名为“play2”。 在添加按钮后,读者可以在“播放器”层上面添加一图层,名为“按钮”,并将所有的按钮拖到合适的位置。通过点一下按钮层的第 1...

    as ssd Benchmark

    顺序读写速度是衡量硬盘传输大文件能力的重要标准,例如在复制大型视频文件时的速度。AS SSD Benchmark通过模拟大文件读写,能准确测出SSD在这方面的表现。4K随机读写则是反映硬盘处理大量小文件或者多任务并发能力...

    ASSSD硬盘检测.rar

    5. **复制测试**:模拟实际文件复制过程,测试SSD的数据迁移速度和一致性。 6. **TRIM支持检测**:TRIM是SSD特有的功能,可以优化空闲块的管理,提升写入性能。 7. **SMART信息查看**:显示SSD的自我监控、分析和...

    AS SSD Benchmark.7z

    3. **4K-64线程队列深度测试**:在多任务环境下,模拟大量并发I/O操作,考察SSD在高负载下的性能表现。 4. **复制测试**:评估数据在SSD内部或与其他存储设备间复制的效率。 5. **压缩数据测试**:测试SSD在处理已...

    AS SSD Benchmark 汉化版

    汉化版的AS SSD Benchmark还提供了其他实用功能,如复制基准测试,模拟实际文件复制过程中的速度;以及压缩基准测试,检查SSD在处理压缩数据时的性能。此外,它还可以检测硬盘的4K对齐情况,4K未对齐会显著降低SSD的...

Global site tag (gtag.js) - Google Analytics