使用Cirrus反序列化接收的对象

时间:2012-06-08 01:02:00

标签: actionscript-3 flash serialization amf adobe-cirrus

我正在使用Cirrus将一些值传递给我游戏中的其他玩家,其中一些值是对象,事实是,当我收到这些对象时,它们会丢失类型,并且它们会成为通用对象。

我读过Cirrus使用AMF,但我不知道如何重新获得数据的原始对象类型。

编辑:

//these are the classes involved

registerClassAlias("Action", Action);
registerClassAlias("EntityVO", EntityVO);
registerClassAlias("Point", Point);

//Action takes 3 parameters
Action(type:String = "", entity:EntityVO = null, target:EntityVO = null)

// when EntityVO doesnt require a parameter in the constructor or it has a string/int parameter this works:

var entity = new EntityVO();
var byteArray:ByteArray;
byteArray = new ByteArray();
byteArray.writeObject(action);
byteArray.position = 0;
var object:Object = byteArray.readObject(); //<- works ok

//when I make EntityVO to take a non standard parameter like, a Point, like this:

EntityVO(point:Point = null)

//and I do this:

var entity:EntityVO = new EntityVO(new Point());
var action:Action = new Action("addEntity", entity);
var byteArray:ByteArray;
byteArray = new ByteArray();
byteArray.writeObject(action);
byteArray.position = 0;
var object:Object = byteArray.readObject(); //<- it goes into the EntityVO constructor and says that point is null, (I use point in the constructor to set something)

1 个答案:

答案 0 :(得分:1)

你需要做两件事:

  1. registerClassAlias("alias", classOfTheObjectSerialized)这告诉Flash播放器在从/向可写/可读介质(例如Socket,ByteArray,NetConnection等)读取和写入类时,需要使用“alias”字符串。 / p>

  2. 确保你在两端(发送和接收)都这样做,并且被序列化的对象在构造函数中没有非默认参数,它们的属性也是可序列化的(即遵守与描述相同的规则)上文)。

  3. PS。您还需要注意一些对象本身不可序列化,例如,没有任何显示对象,在诸如流之类的资源上操作的对象也不可序列化。由于没有默认构造函数,即使BitmapData也不可序列化。