zoukankan      html  css  js  c++  java
  • 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)

     

  • 相关阅读:
    springmvc&参数绑定&异常处理&Json数据交互&上传图片
    从零开始搭建一个vue.js的脚手架
    supervisor配置详解(转)
    supervisor 从安装到使用
    linux下如何查看某软件是否已安装
    linux yum命令详解
    Vue.js 和 MVVM 小细节
    PHP7的异常处理机制,set_error_handler和set_exception_handler方法介绍
    使用 acme.sh 签发续签 Let‘s Encrypt 证书 泛域名证书
    SSH原理与运用(一):远程登录
  • 原文地址:https://www.cnblogs.com/kaka1969/p/2690403.html
Copyright © 2011-2022 走看看