热门标签 | 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



推荐阅读
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 在 Swift 编程中,遇到错误提示“一元运算符 '!' 不能应用于 '()' 类型的操作数”,通常是因为尝试对没有返回值的方法或函数应用逻辑非运算符。本文将详细解释该错误的原因,并提供解决方案。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 对象自省自省在计算机编程领域里,是指在运行时判断一个对象的类型和能力。dir能够返回一个列表,列举了一个对象所拥有的属性和方法。my_list[ ... [详细]
  • 采用IKE方式建立IPsec安全隧道
    一、【组网和实验环境】按如上的接口ip先作配置,再作ipsec的相关配置,配置文本见文章最后本文实验采用的交换机是H3C模拟器,下载地址如 ... [详细]
  • This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ... [详细]
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社区 版权所有