现在的位置: 首页 > 综合 > 正文

如何获取AMF3对象类名

2012年12月02日 ⁄ 综合 ⁄ 共 1353字 ⁄ 字号 评论关闭

对不熟悉AMF3的人来说,这名词有点玄乎,AMF3不过两个函数而已

//编码(把对象序列化成AMF3)
1 bateArray.writeObject(obj:Object):void

//解码 (反序列化,获取对象)
2 bateArray.readObject():Object

如果需要序列化的对象就是一个哈希map(key-value的集合),那么一切正常
但是如果你要序列化一个Class,同时把这个Class的类名也序列化到ByteArray中,那么

是bateArray.writeObject是不能满足需求的,如果需要写的对象是一个Class的实例,writeObject则会把这个Class
里面的public变量抽出来放入到一个新的哈希map里(Object),在Object里新建与类的public成员变量同名的动态属性,并赋值,例
如一个ModeClass类,它有两个属性:
private var id:int = 10000;
public var nick:String = "wewell"
当把这个类的实例打包成amf3的时候,实际状况其实变成了这样:
bateArray.readObject({nick:"wewell"})
这样,打包的amf3对象其实已经没有了类名(同时,static成员,const的成员,private成员,所有方法,包括public get 方法都会被忽略掉)
而如果为了实现一些类似RPC的调用过程,直接打类打包时,这就要搬外援了,这个外援就是:
public function registerClassAlias(aliasName:String, classObject:Class):void

在writeObject之前,对需要打包的类调用一次registerClassAlias,就能达到存取类的目的了(get方法的值也可正常存取)
示例代码:
            //AMF3对象编码
            registerClassAlias("ModeClass", ModeClass);
            var modeClass:ModeClass = new ModeClass();
            var ba:ByteArray = new ByteArray();
            ba.writeObject(modeClass); //默认情况下把类的public变量抽出来打包成一个map (public变量对应Object动态属性)
           
            //AMF3对象解码
            ba.position = 0;
            var mode:* = ba.readObject();
            trace(mode is ModeClass);//true
            trace(ba.toString());
            trace(getQualifiedClassName(mode));//ModeClass
           
            //var cls:Class = getClassByAlias(getQualifiedClassName(mode));
            //var amf:Object = new cls() as ModeClass;

抱歉!评论已关闭.