0

私は 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)
4

1 に答える 1

1

あなたは2つのことをする必要があります:

  1. registerClassAlias("alias", classOfTheObjectSerialized)これは、書き込み可能/読み取り可能なメディア(Socket、ByteArray、NetConnectionなど)との間でクラスを読み書きするときに「エイリアス」文字列を使用する必要があることをFlashプレーヤーに通知します。

  2. 両端(送信と受信の両方)でこれを実行し、シリアル化されるオブジェクトのコンストラクターにデフォルト以外の引数がないこと、およびそれらのプロパティもシリアル化可能であることを確認してください(つまり、上記と同じルールに準拠します)。

PS。また、一部のオブジェクトは本質的にシリアル化できないことに注意する必要があります。たとえば、表示オブジェクトはいずれもシリアル化できません。ストリームなどのリソースを操作するオブジェクトもシリアル化できません。デフォルトのコンストラクターがないため、BitmapDataでさえシリアル化できません。

于 2012-06-08T09:41:06.513 に答える