看来并不是所有对象都能用字节码的方法复制,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
}
其实用的不多,瞎研究而已 ╯□╰