2012-06-08 30 views
0

我使用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) 
+0

如果兩個swfs都具有相同版本的同一類,我會對此圖像進行自動反序列化,但我能想到的唯一問題是對象是否與交互客戶機上的版本不同。使用AMF與BlazeDS一起使用RemoteAlias元數據標記或註冊別名,但我相信這只是一個Java類名或PHP類名映射到AS3類,我會想象,因爲這是所有類型的AS3/AMF保留。你確定兩個客戶有相同的確切瑞士法郎嗎? – shaunhusain

+0

是的,他們是同樣的swfs。 – Artemix

+0

我明白,但是,Action類在構造函數中需要一個EntityVO自定義對象,爲什麼這個工作呢?,它不應該。 – Artemix

回答

1

你需要做兩件事情:

  1. registerClassAlias("alias", classOfTheObjectSerialized)這告訴它需要使用「別名」字符串閱讀和寫作課從/到時,Flash播放器可寫/可讀介質(如Socket,ByteArray,NetConnection等)。

  2. 確保你這樣做的兩端(發送和接收),而物體被序列不具備構造非默認參數,它們的性能也可序列化(即遵循相同的規則,如上所述)。

PS。您還需要了解某些對象本身不可序列化,例如,沒有任何顯示對象,操作資源(如流)的對象也不可序列化。即使BitmapData由於沒有默認構造函數而不可序列化。

+0

在我的情況下,我發送一個「Actions」數組,這是一個包含動作類型(字符串)和實體(EntityVO類)的類。所以,如果我做registerClassAlias(「model.Action」,Action)它應該工作? – Artemix

+0

它不起作用,它說Action上有一個參數計數不匹配(期望2,得到0),我在兩端都做了這個: registerClassAlias(「model.EntityVO」,EntityVO); registerClassAlias(「actions.Action」,Action); – Artemix

+0

好的,我需要將默認參數添加到我的Action類構造函數中,但對象類型仍然是「Object」。 – Artemix