- 浏览: 261309 次
- 性别:
- 来自: 福州
文章分类
最新评论
-
sflscar:
太好了,我搞了一下午,批量插入,第一个参数个数没对sql批量导 ...
redis pipe大数据量导入 -
赵青青:
那 entity.hbm.xml 文件中的主健策略怎么配置 ...
Hibernate 和 Access -
GapStar:
换成flash IconCellRenderer.as应该怎么 ...
DataGrid 中加入图标 -
binbinyouli:
不好意思。我把楼主注释掉得部分打开了。但是我看楼主有传递对象的 ...
Flex Flash 和JAVA 在Socket交互 -
binbinyouli:
不知道前两位评论人时怎么做得。我再做这个例子的时候出现了安全沙 ...
Flex Flash 和JAVA 在Socket交互
13.11 深度拷贝一个ArrayCollection集合
13.11.1 问题
需要拷贝一个索引数组里的所有项或者从一个对象创建一个新对象。
13.11.2解决
使用mx.utils.ObjectUtil.copy方法
13.11.3讨论
正如演示那样,copy一个对象仅仅是为新对象创建了一个指针。意味着对第一个对象值的任何改变都会反映到第二个对象上。
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
{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;
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
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个参数:
为了反序列化此数据对象,该类型必须通过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个方法,你可以注册任何对象的类:
在这里的例子中,拷贝对象时既不知道全类名也不知道该类的一个引用。幸运的是,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);
}
{
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));
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>
<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>
<!--对象的深度拷贝-->
<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>
<!--特定类对象的深度拷贝-->
<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>
发表评论
-
Flex中使用JSon
2009-10-10 19:58 1090这是我从一位网友里看的例子,发现用Json真的很方便。附件中是 ... -
Flex 预载界面美化 Flex's preloader is not so flex
2009-03-03 16:24 3060转自: http://riashanghai.com/zh-h ... -
Flex 嵌入资源
2009-03-03 16:22 1289http://www.adobe.com/cn/devnet/ ... -
Flex中的嵌入资源(Embedding Assets)
2009-03-03 16:19 1318转自:http://hi.baidu.com/sw ... -
如何监听Canvas上滚动条的出现或隐藏 Quick Tip: How to Monitor the
2009-03-03 15:41 1851转自:http://riashanghai.com/zh-ha ... -
Flex中Event与Bindable
2009-03-03 15:37 4119转自:http://liguoliang.com Event: ... -
ResourceBundle用法
2009-03-03 11:18 2995ResourceBundle 用于解释资源文件。 1.新建 ... -
用Point+Graphics画虚线
2009-03-03 10:57 1515Graphics为我们提供了moveTo/lineTo,dra ... -
一个flex例子(自定义download progress bar的)
2009-03-03 10:52 2398预览:http://www.onflex.org/flexap ... -
同一个Column,不同ItemEditor
2009-03-03 10:19 1268这类需求比较少见,不过还是被我碰上了,哈哈。AdvancedD ... -
自定义Flex的Loading界面
2009-02-25 17:37 4615这个方法网上已经有人写过例子... 在这里我只是自己做个实例并 ... -
Flex Metatag
2009-02-25 14:15 1441Have you ever used [Bindable] i ... -
flex:嵌入应用程序资源
2008-12-29 14:56 1136可以在 Adobe® Flex™ 应用程序中嵌入各种类型的资源 ... -
Flex开发自定义控件(基础篇)
2008-12-29 14:53 1418前期准备: 点击File菜单 -> New -> ... -
Flex 中的元数据标签
2008-12-29 14:45 1345Flex 元数据标签——告诉编译器如何编译 虽然多数F ... -
Flex Flash 和JAVA 在Socket交互
2008-12-29 14:40 7154首要要了解.两种语言是 ... -
AS3的网页参数处理
2008-12-29 14:36 1243我们一般向网页swf文件传入参数有两种方式,一种是URL如: ... -
Cookie类
2008-12-29 14:36 987[AS3]Cookie类 [AS2]Flash版本的Cooki ... -
Flex学习笔记_09 数据绑定_晋级篇
2008-12-29 14:34 9029.2.1 函数和类级别的绑定 [Bindable]标签打使用 ... -
通过as3.0将文件保存到本地
2008-12-29 14:32 1830在一般情况下,网页上的Flash是不能对客户端的文件进行操作的 ...
相关推荐
"cookbook-zh-CN.md"文件很可能是这本书的主要文本部分,里面详细列举了各种使用PySimpleGUI的技巧和实践案例。每个章节通常会介绍一个特定的功能或概念,并配有相应的代码示例。通过阅读和实践这些例子,开发者可以...
python-machine-learning-cookbook-preprocessing oreilly 英文 epub格式
《CMake Cookbook》是关于构建、测试和打包模块化软件的专业指南,专注于现代CMake工具的使用。本书由Radovan Bast和Roberto Di Remigio合著,旨在帮助读者掌握CMake这一强大的跨平台构建系统。 CMake是一个开源的...
Programming ArcGIS with Python Cookbook - Second Edition, mobi格式
标题“coverage-cookbook-complete-verification-academy”表明这是一本关于覆盖度(coverage)的食谱手册,隶属于Cadence Academy的官方文件。这种手册通常包含一系列经过精心设计的指导方案,旨在帮助读者理解和...
Programming ArcGIS with Python Cookbook - Second Edition,epub格式
docker run -tid -p <port>:80 apachecn0/pandas-cookbook-code-notes # 访问 http://localhost:{port} 查看文档 PYPI pip install pandas-cookbook-code-notes pandas-cookbook-code-notes # 访问 ...
Unity Game Development Cookbook - Paris Buttfield-AddisonUnity Game Development Cookbook - Paris Buttfield-Addison
Lott -- Modern Python Cookbook -- 2016 -- code.7z
Aggarwal -- Flask Framework Cookbook -- 2014 -- code.7z
Subramanian -- Python Data Science Cookbook -- 2015 -- code.7z
Fine -- Python 2.6 Graphics Cookbook -- 2010 -- code.7z
"NGINX Cookbook 高性能负载平衡高级配方" NGINX Cookbook 是一本专门介绍 NGINX 高性能负载平衡的书籍,书中涵盖了 NGINX 的高级配方和使用技巧,可以帮助读者快速搭建高性能的负载平衡系统。 GeoIP 模块和数据库...
Zaccone -- Python Parallel Programming Cookbook -- 2015 -- code.7z
Precord -- wxPython. Application Development Cookbook -- 2015 -- code.7z
Linux Shell Scripting Cookbook - Third Edition by Clif Flynt English | 29 May 2017 | ASIN: B01N80F75Z | 552 Pages | AZW3 | 1.36 MB Do amazing things with the shell About This Book Become an expert ...