最近有点儿时间,帖点儿小经验给大家.有不妥之处敬请包涵. 用byteArray克隆对象,估计大家大多数都用过.应该是类似下面的实现
var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return copier.readObject();
但对于一个相当复杂的对象,要达到完全克隆,还面临着很多问题. 比如下面这几种情况: 1:属性是自定义类型 2.属性是数组,而且数组元素是自定义类型 3.属性是接口形式,但现实是某种实现 4.属性是Dictionary 等等.不知道大家是否碰到过这样的情况. 所以经过研究,对上面的方法进行了一些拓展.形成了下面这种方式进行克隆.
private static function regtype(tn:String):void { if (tn == null || tn == "null" || tn == "int" || tn == "string" || tn == "Number" || tn == "String" || tn == "Boolean" || tn == "Object")return; var type:Class; try { type = getClassByAlias(tn); } catch(err:Error) { } if (type != null)return; try { type = Class(getDefinitionByName(tn)); } catch(err:Error) { return; } if (type == null)return; registerClassAlias(tn, type); }
private static function registerClass(source:*):void { var tn:String = getQualifiedClassName(source); regtype(tn); if(tn=="Array"||tn=="flash.utils::Dictionary"){ for(var ele:String in source){ registerClass(source[ele]); } } var dxml:XML = describeType(source); for each(var acc:XML in dxml.accessor) { registerClass(source[acc.@name]); } for each(var acc1:XML in dxml.variable) { registerClass(source[acc1.@name]); } for each(var acc2:XML in dxml.implementsInterface) { regtype(acc2.@type); } regtype(dxml.extendsClass.@type); }
public static function baseClone(source:*):* { registerClass(source); var copier:ByteArray = new ByteArray(); copier.writeObject(source); copier.position = 0; return copier.readObject(); }
其中baseClone是入口方法,其余两个做辅助工作.具体原理是: 1.用describeType方法对原始对象进行结构分析 2.把原始对象的复杂属性注册别名 3.递归进行2操作.
|