Десериализация объектов, полученных с использованием 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 ответ
Вам нужно сделать две вещи:
registerClassAlias("alias", classOfTheObjectSerialized)
это говорит Flash Player, что ему нужно использовать строку "псевдоним" при чтении и записи классов с / на записываемый / читаемый носитель (например, Socket, ByteArray, NetConnection и т. д.).Убедитесь, что вы сделали это на обоих концах (как отправка, так и получение) и что сериализуемые объекты не имеют аргументов не по умолчанию в конструкторе, их свойства также сериализуемы (т.е. придерживаются тех же правил, как описано выше).
PS. Вы также должны знать, что некоторые объекты по своей природе не сериализуемы, например, ни один из экранных объектов не является, объекты, которые работают с такими ресурсами, как потоки, также не сериализуются. Даже BitmapData не сериализуем из-за отсутствия конструктора по умолчанию.