2012-06-08 2 views
0

Я использую Cirrus для передачи некоторых значений другим игрокам в моей игре, и некоторые из этих значений являются объектами, а это значит, что когда я получаю эти объекты, они теряют свой тип, и они становятся общие объекты.Deserializing объекты, полученные с использованием 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

Если обе swf имеют одну и ту же версию того же класса, я бы хотел, чтобы это было автоматически десериализовано, единственная проблема, о которой я мог думать, - это то, что объект является другой версией для взаимодействующих клиентов. При использовании AMF с BlazeDS используется тег метаданных RemoteAlias ​​или псевдоним регистрации, но я считаю, что это всегда просто имя класса Java или имя класса PHP для сопоставления с классом AS3, я бы представлял, так как это все AS3/AMF, тип будет сохраняется. Вы уверены, что оба клиента имеют одинаковый swf? – shaunhusain

+0

Да, это те же самые swfs. – Artemix

+0

Я понимаю, но класс Action требует, чтобы в конструкторе пользовательский объект EntityVO, почему это работает тогда ?, он не должен. – Artemix

ответ

1

Вы должны сделать две вещи:

  1. registerClassAlias("alias", classOfTheObjectSerialized) это говорит Flash-плеер он должен использовать «псевдоним» строку при чтении и записи классов от/до записываемый/читаемый носитель (например, Socket, ByteArray, NetConnection и т. д.).

  2. Убедитесь, что вы сделали это на обоих концах (как для отправки, так и для получения), и что объекты, которые были сериализованы, не имеют аргументов по умолчанию в конструкторе, их свойства также сериализуемы (то есть придерживаются тех же правил, которые описаны выше).

PS. Вам также необходимо знать, что некоторые объекты по сути не сериализуемы, например, ни один из экранных объектов, объекты, которые работают с такими ресурсами, как потоки, также не могут быть сериализуемыми. Даже BitmapData не сериализуется из-за отсутствия конструктора по умолчанию.

+0

В моем случае я посылаю массив «Действия», который представляет собой класс, который состоит из типа действия (строки) и сущности (класса EntityVO). Итак, если я зарегистрируюClassAlias ​​(«model.Action», Action), он должен работать? – Artemix

+0

Это не работает, в нем говорится о несоответствии счетчика аргументов в действии (ожидается 2, получено 0), я сделал это на обоих концах: registerClassAlias ​​(«model.EntityVO», EntityVO); registerClassAlias ​​("actions.Action", Action); – Artemix

+0

Хорошо, мне нужно было добавить аргументы по умолчанию в свой конструктор класса Action, но тип объекта по-прежнему «Object». – Artemix

Смежные вопросы