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,例如
registerClassAlias("point",Point); registerClassAlias("test",RegisterClassAliasTest) |