关于flash中对象的复制总结

本文探讨了ActionScript 3 (AS3) 中的序列化与反序列化技术,重点介绍了如何使用registerClassAlias方法确保自定义类能够被正确地序列化和反序列化。文章还讨论了特定情况下序列化失败的问题,如构造函数带参数的类和复合类的处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看来并不是所有对象都能用字节码的方法复制,MovieChip就是一个。

 

注1:读取时先转换为Object ba.readObject() as Object  

注2:registerClassAlias("com.example.sp", Sprite);  注册别名可以再读取对象时正确读出来(方法2)

     由于为类注册了别名,因此可以将对象作为 该类 的实例反序列化;

 

(registerClassAlias在利用AMF3进行序列话网络通讯中,是非常有用的。需要把客户端的对象直接传送到服务器得时候,保留该对象的类(类型)。

  这样的话,就可以传送自定义对象或者系统自带对象。)

 

注3:不是所有类都能复制,例如 MovieClip

注4:readObject方法对构造器有参数的类,是会出错的,会弹出参数数量不匹配这个错误。因为还原对象进行反射的时候,是默认没有参数的给构造器的。这也是有些人

     讨论一些对象不能进行深度拷贝的原因。

     还有一个就是,如果那个类包含了多个类,也就是个复合类,那么里面的那个复合类,也必须进行registerClassAlias。

例如

package

{

import flash.geom.Point;

public class Test

{

public var name:String;

public var point:Point;

}

}

 

这样需要写两条语句才能完全把Test序列化

registerClassAlias("point",Point);

registerClassAlias("test",Test)

 

------------------------------------------------------------------------------------------------------------------------------------------------------

 

方法1:

public function test4()

{

var txt:Sprite;

txt = new Sprite;

txt.x = 10;

var ba:ByteArray = new ByteArray();

ba.writeObject(txt);

ba.position = 0;

var haha:Object = (ba.readObject() as Object);  //由于没有注册别名,只能以Object来进行复制后新对象的各种属性的调用

trace(haha.x);  //输出10

/* 或

var ba:ByteArray = new ByteArray();

ba.writeObject({ga:txt});

ba.position = 0;

var haha:Object = (ba.readObject() as Object);  //由于没有注册别名,只能以Object来进行复制后新对象的各种属性的调用

trace(haha.ga.x);  //输出10

*/

}

方法2:

public function test4()

{

var txt:Sprite;

registerClassAlias("com.example.sp", Sprite);

txt = new Sprite;

txt.x = 10;

var ba:ByteArray = new ByteArray();

ba.writeObject(txt);

ba.position = 0;

var haha:Sprite = (ba.readObject() as Object) as Sprite;  //注册了别名,可以进行复制后新对象反序列化,用该类型的变量来接受新对象

trace(haha.x);  //输出10

}

 

 

其实用的不多,瞎研究而已  ╯□╰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值