所谓registerClassAlias,要明白他的使用背景。
当前后台或者两个独立程序之间传递数据vo时,以前的方案有如xml(soap)、json。
这些方案都比较臃肿,特别是soap。
于是adobe推出了AMF,采用二进制进行数据传递(类似的框架有google的protobuf)。
如果要传递自定义数据类型实现解码端自动映射,肯定必须在序列化端加入额外信息,同时解码端要能根据这些额外信息自动转码映射。
说到这应该明白了,registerClassAlias就是用来干这活的。
序列化端,在序列化之前registerClassAlias("xxx", classA),会把这个别名信息加入到二进制数据中。
解码端,在解码之前同样registerClassAlias("xxx", classB),则会把这个二进制数据自动生成一个classB对象,当然前提是classB必须包含classA的所有属性。
大概意思如下(通常序列化端和解码端是不同的程序,甚至不同的语言):
//序列化端
registerClassAlias("hahaha", DataVO);
var vo:DataVO = new DataVO();
var ba:ByteArray = new ByteArray();
ba.writeObject(vo);
ba.position = 0;
//解码端
registerClassAlias("hahaha", DataVO);
var vo2:Object = ba.readObject();
if(vo2 is DataVO) {
trace("vo2 is DataVO", vo2.p1, vo2.p2);
}
else {
trace("vo2 isn't DataVO");
}
附:
adobe registerClassAlias api说明
protobuf项目地址
registerClassAlias前后的二进制数据对比