vo的深复制

public function clone():MyVO

{

  var copier:ByteArray    = new ByteArray();
  copier.writeObject(this);
  copier.position     = 0;
  return copier.readObject() as MyVO;
}

这种方法返回为空,readObject返回的object不能转换成MyVO.

 

这时要用到registerClassAlias这个函数,

public function registerClassAlias(aliasName:String, classObject:Class):void  

语言版本: ActionScript 3.0

 

运行时版本: AIR 1.0 Flash Player 9

当以 Action Message Format (AMF) 对一个对象进行编码时,保留该对象的类(类型)。将对象编码为 AMF 时,该函数将保存该对象的类的别名,以便在解码对象时可以恢复该类。如果编码上下文没有为对象的类注册别名,该对象将被编码为一个匿名对象。同样,如果解码上下文注册了不同的别名,将为解码后的数据创建一个匿名对象。LocalConnection、ByteArray、SharedObject、NetConnection 及 NetStream 均为将对象编码为 AMF 的类的示例。编码和解码上下文不必对别名使用相同的类。它们可以主动地改变类,条件是目标类包含源类序列化的所有成员。 参数

  aliasName:String — 要使用的别名。
 
  classObject:Class — 与给定别名相关联的类。

 

此示例使用 registerClassAlias() 函数为 ExampleClass 注册一个别名 ( com.example.eg )。由于为类注册了别名,因此可以将对象作为 ExampleClass 的实例反序列化,且代码将输出 true。如果删除 registerClassAlias() 调用,则代码将输出 false。
package {
    import flash.display.Sprite;
    import flash.net.registerClassAlias;
    import flash.utils.ByteArray;

    public class RegisterClassAliasExample extends Sprite {
        public function RegisterClassAliasExample() {
            registerClassAlias("com.example.eg", ExampleClass);
            var eg1:ExampleClass = new ExampleClass();
            var ba:ByteArray = new ByteArray();
            ba.writeObject(eg1);
            ba.position = 0;
            var eg2:* = ba.readObject();
            trace(eg2 is ExampleClass); // true
        }
    }
}

class ExampleClass {}
------------------------------------------------------------------------------------------------------------------------------------看起来不错哦,让我们接下来试试看:



01.public function clone():Object
02.{
03.var typeName:String     = getQualifiedClassName(this);//获取当前类完全类名
04.var packageName:String  = typeName.split("::")[0];//截取命名空间之前的包名
05.var type:Class          = getDefinitionByName(typeName) as Class;//获取当前类定义
06. 
07.registerClassAlias(packageName, type);//使用当前类的包名作为类别名,类定义作为注册类
08. 
09.var copier:ByteArray    = new ByteArray();
10.copier.writeObject(this);
11.copier.position         = 0;
12. 
13.return copier.readObject();
14.}


registerClassAlias的第一个参数为要使用的别名,我觉得这个别名随便取什么都不会有影响,不过为了规范起见,还是将别名设置为当前类的包名好了。此时调用clone方法发现能够如预期那样得到正确类型的对象,且保留了和拷贝源一致的所有属性,耶!拷贝成功!而且使用这招可以在使用继承的时候不必写任何冗余代码,即MyVO的任何子类都不需要重写clone方法也能正常工作。知道此方法的人撸过就好了,不知道的人记一下哦,省得和我以前一样,加重编码负担。不过需要注意哦,深拷贝对显示对象(DisplayObject)不起作用~

 

补充说明:

 

替楼主补充一点:
如果那个类包含了多个类,也就是个复合类,那么里面的那个复合类,也必须进行registerClassAlias,例如
  1. package com.gdlib.test
  2. {
  3.         import flash.geom.Point;
  4.         public class RegisterClassAliasTest
  5.         {
  6.                 public var name:String;
  7.                 public var type:String;
  8.                 
  9.                 public var point:Point;
  10.                 
  11.                 public function RegisterClassAliasTest()
  12.                 {
  13.                 }
  14.         }
  15. }
复制代码
这样需要写两条语句才能完全把RegisterClassAliasTest序列化
registerClassAlias("point",Point);
registerClassAlias("test",RegisterClassAliasTest)

 

posted on 2012-09-18 13:21  端小六  阅读(349)  评论(0编辑  收藏  举报