热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AS3中的数据深度复制技术详解

在探讨AS3中的数据深度复制技术时,本文详细介绍了实现数据深度克隆的有效方法。通过对比多种方案,最终确定了一种高效且可靠的实现方式,所有代码均来源于公开资源,确保了方法的实用性和可操作性。

今天闲来无事,为了做一个小功能,牵涉到数据的深度克隆,在折腾再三还是找到了一个最完美的方法(声明:代码都是引用的)。

第一次用的是byteArray+类注册做的,因为有复杂数据和vector和Array类型,最后克隆出来的数据类型丢失,代码如下:

  1. private static var aliasList:Array = [];
  2.                 /**
  3.                  * 复制一个对象
  4.                  * @param sourceObj        要复制的源对象
  5.                  * @param deep                是否对对象进行AMF序列化以后再深度复制
  6.                  * @return
  7.                  */
  8.                 public static function clone(sourceObj:*, deep:Boolean=true):*
  9.                 {
  10.                         if(!sourceObj)
  11.                                 return null;
  12.                         var lastTime:Number = getTimer();
  13.                         if(deep)
  14.                         {
  15.                                 // 得到  sourceObj的类名
  16.                                 var qualifiedClassName:String = getQualifiedClassName(sourceObj);
  17.                                 if(aliasList.indexOf(qualifiedClassName) == -1)
  18.                                 {
  19.                                         // e.g  com.gdlib.test::RegisterClassAliasTest
  20.                                         var packageName:String = qualifiedClassName.replace("::", ".");
  21.                                         // 得到 sourceObj的类的类定义
  22.                                         var classType:Class = getDefinitionByName(qualifiedClassName) as Class;
  23.                                         // 注册此别名和类
  24.                                         if(classType)
  25.                                         {
  26.                                                 registerClassAlias(packageName, classType);
  27.                                                 aliasList.push(qualifiedClassName);
  28.                                                 trace("register class", packageName);
  29.                                         }
  30.                                         // 注册类公共属性(如果是复合类)
  31.                                         registerVariables(sourceObj);
  32.                                 }
  33.                         }
  34.                         // 复制此对象
  35.                         var b:ByteArray = new ByteArray();
  36.                         b.writeObject(sourceObj);
  37.                         b.position = 0;
  38.                         trace("Clone object takes", getTimer()-lastTime, "ms.\n");
  39.                         return b.readObject();
  40.                 }
  41.                 /**
  42.                  * 注册某个类的公共属性(如果是复合类)所属的类的别名.
  43.                  * @param sourceObj
  44.                  */
  45.                 private static function registerVariables(sourceObj:*):void
  46.                 {
  47.                         // 注册类公共属性(如果是复合类)
  48.                         var xml:XML = describeType(sourceObj);
  49.                         var variable:XML;
  50.                         var variableType:String;
  51.                         var variablePackageName:String;
  52.                         var variableClassType:Class;
  53.                         var variableXml:XMLList;
  54.                         if(sourceObj is Class)
  55.                                 variableXml = xml.factory.variable;
  56.                         else
  57.                                 variableXml = xml.variable;
  58. //                       
  59. //                               
  60. //                                 
  61. //                               
  62. //                       
  63. //                       
  64. //                               
  65. //                                 
  66. //                               
  67. //                         
  68.                         for each (variable in variableXml)
  69.                         {
  70.                                 variableType = variable.@type;
  71.                                 if(variableType.indexOf("::") != -1)
  72.                                 {
  73.                                         if(aliasList.indexOf(variableType) == -1)
  74.                                         {
  75.                                                 // "flash.geom::Point"        转换为         "flash.geom.Point"
  76.                                                 variablePackageName = variableType.replace("::", ".");
  77.                                                 variableClassType = getDefinitionByName(variableType) as Class;
  78.                                                 // 注册此别名和类
  79.                                                 if(variableClassType)
  80.                                                 {
  81.                                                         registerClassAlias(variablePackageName, variableClassType);
  82.                                                         registerVariables(variableClassType);
  83.                                                         aliasList.push(variableType);
  84.                                                         trace("register variable", variablePackageName);
  85.                                                 }
  86.                                         }
  87.                                 }
  88.                         }
  89.                 }

于是乎,继续找结果找到了以下的方法:

首先,这个需要引用类库as3-commons-reflect(比较详细的解说可以看这:http://topmanopensource.iteye.com/blog/491080  下载类库地址:http://www.as3commons.org/as3-commons-reflect/)

/**
* 深度clone某个对象,包含Vector 和 Array
*/
public static function clone (_obj : * ): *
{
var returnCloneObj :*;
var objType : Type = Type . forInstance (_obj );
if (_obj is Vector .<*> || _obj is Array )
{
returnCloneObj &#61; new objType . clazz ();
for each (var eachCloneObj :* in _obj )
{
returnCloneObj . push (cloneObj (eachCloneObj ));
}
}
else
{
returnCloneObj &#61; cloneObj (_obj );
}
return returnCloneObj ;
}
/**
* clone 只能clone简单对象的所有的public属性
*/
private static function cloneObj (_obj : * ): *
{
var objType : Type &#61; Type . forInstance (_obj );
var cloneObj :* &#61; new objType . clazz ();
for each (var field : Field in objType . properties )
{
if (field is Variable || field is Accessor && Accessor (field ). writeable && field . name !&#61; &#39;prototype&#39; )
{
cloneObj [ field . name ] &#61; _obj [ field . name ];
}
}
return cloneObj ;
}

 

/**
* 深度clone某个对象&#xff0c;包含Vector 和 Array
*/
public static function clone (_obj : * ): *
{
var returnCloneObj :*;
var objType : Type &#61; Type . forInstance (_obj );
if (_obj is Vector .<*> || _obj is Array )
{
returnCloneObj &#61; new objType . clazz ();
for each (var eachCloneObj :* in _obj )
{
returnCloneObj . push (cloneObj (eachCloneObj ));
}
}
else
{
returnCloneObj &#61; cloneObj (_obj );
}
return returnCloneObj ;
}
/**
* clone 只能clone简单对象的所有的public属性
*/
private static function cloneObj (_obj : * ): *
{
var objType : Type &#61; Type . forInstance (_obj );
var cloneObj :* &#61; new objType . clazz ();
for each (var field : Field in objType . properties )
{
if (field is Variable || field is Accessor && Accessor (field ). writeable && field . name !&#61; &#39;prototype&#39; )
{
cloneObj [ field . name ] &#61; _obj [ field . name ];
}
}
return cloneObj ;
}

 

终于可以万能的深度克隆各种数据了。

转:https://www.cnblogs.com/lweinking/p/3616410.html



推荐阅读
  • 在单个图表中实现饼图与条形图的精准对齐 ... [详细]
  • 如何在Java中高效构建WebService
    本文介绍了如何利用XFire框架在Java中高效构建WebService。XFire是一个轻量级、高性能的Java SOAP框架,能够简化WebService的开发流程。通过结合MyEclipse集成开发环境,开发者可以更便捷地进行项目配置和代码编写,从而提高开发效率。此外,文章还详细探讨了XFire的关键特性和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 如何在Android应用中设计和实现专业的启动欢迎界面(Splash Screen)
    在Android应用开发中,设计与实现一个专业的启动欢迎界面(Splash Screen)至关重要。尽管Android设计指南对使用Splash Screen的态度存在争议,但一个精心设计的启动界面不仅能提升用户体验,还能增强品牌识别度。本文将探讨如何在遵循最佳实践的同时,通过技术手段实现既美观又高效的启动欢迎界面,包括加载动画、过渡效果以及性能优化等方面。 ... [详细]
  • 如何判断一个度序列能否构成简单图——哈维尔-哈基米算法的应用与解析 ... [详细]
  • 开发笔记:校园商铺系统中店铺注册功能模块的Controller层优化与重构
    开发笔记:校园商铺系统中店铺注册功能模块的Controller层优化与重构 ... [详细]
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • 第五章详细探讨了 Red Hat Enterprise Linux 6 中的 Ext3 文件系统。5.1 节介绍了如何创建 Ext3 文件系统,包括必要的命令和步骤,以及在实际操作中可能遇到的问题和解决方案。此外,还涵盖了 Ext3 文件系统的性能优化和维护技巧,为用户提供全面的操作指南。 ... [详细]
  • RancherOS 是由 Rancher Labs 开发的一款专为 Docker 设计的轻量级 Linux 发行版,提供了一个全面的 Docker 运行环境。其引导镜像仅 20MB,非常适合在资源受限的环境中部署。本文将详细介绍如何在 ESXi 虚拟化平台上安装和配置 RancherOS,帮助用户快速搭建高效、稳定的容器化应用环境。 ... [详细]
  • 深入解析Spring框架中的双亲委派机制突破方法
    在探讨Spring框架中突破双亲委派机制的方法之前,首先需要了解类加载器的基本概念。类加载器负责将类的全限定名转换为对应的二进制字节流。每个类在被特定的类加载器加载后,其唯一性得到保证。然而,这种机制在某些场景下可能会限制灵活性,因此Spring框架提供了一些策略来突破这一限制,以实现更加动态和灵活的类加载。这些策略不仅能够提升系统的可扩展性,还能在复杂的运行环境中确保类的正确加载和管理。 ... [详细]
  • 本文探讨了将PEBuilder转换为DIBooter.sh的方法,重点介绍了如何将DI工具集成到启动层,实现离线镜像引导安装。通过使用DD命令替代传统的grub-install工具,实现了GRUB的离线安装。此外,还详细解析了bootice工具的工作原理及其在该过程中的应用,确保系统在无网络环境下也能顺利引导和安装。 ... [详细]
  • 本文将深入探讨Java编程语言中顶级类`Object`的源码实现,旨在为Java新手提供进阶指导。`Object`类是所有Java类的基类,了解其内部机制对于提升编程技能至关重要。文章首先介绍了API文档的使用方法,这对于有开发经验的Java程序员来说是不可或缺的工具。通过详细解析`Object`类的关键方法和属性,读者可以更好地理解Java的核心原理和设计思想。此外,文章还提供了实际代码示例,帮助读者在实践中掌握这些知识。 ... [详细]
  • MySQL日志分析在应急响应中的应用与优化策略
    在应急响应中,MySQL日志分析对于检测和应对数据库攻击具有重要意义。常见的攻击手段包括弱口令、SQL注入、权限提升和备份数据窃取。通过对MySQL日志的深入分析,不仅可以及时发现潜在的攻击行为,还能详细还原攻击过程并追踪攻击源头。此外,优化日志记录和分析策略,能够提高安全响应效率,增强系统的整体安全性。 ... [详细]
  • 深入解析Spring Boot源码的序章
    本系列文章旨在深入解析Spring Boot的源代码,分享笔者在学习过程中的心得与体会。内容涵盖核心源码分析,可能会对初学者造成一定理解难度,建议读者结合笔者提供的详细注释进行阅读,以获得更好的学习体验。 ... [详细]
  • 深入解析Java中的进程与线程机制
    在Java中,进程与线程是程序执行的基本单元。进程代表了程序的运行实例,包含了独立的内存空间和系统资源,如CPU时间、内存、文件和I/O接口。操作系统通过进程来管理和分配这些资源,确保每个程序能够高效、安全地运行。线程则是进程内的基本调度单位,多个线程可以共享进程的资源,从而实现高效的并发处理。本文将深入探讨Java中的进程与线程机制,分析其工作原理和应用场景。 ... [详细]
  • 下面的代码旨在输出其类文件的完整名称。对于不熟悉类字面量的读者,`Me.class.getName()` 方法会返回类的全称,例如 “com.javapuzzlers.Me”。通过这一机制,可以深入了解 Java 类加载和反射机制的内部工作原理。 ... [详细]
author-avatar
mobiledu2502885385
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有