Серверная сторона- Java, клиент — Flex.
Сериализация — процесс представления объекта в виде массива байтов.
Дисериализация — процесс обратный сериализации, т.е. восстановление объекта из набора байтов.
Для сериализации обьекта необходимо чтобы класс, инстансом которого является обьект, реализовывал интерфейс
java.io.Serializable.
public class MyClass implements Serializable
{
private static final long serialVersionUID = 1L;
private int id;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
Теперь определим задачу. У нас есть обьект следующего класса
public class MyList<Object> extends ArrayList<Object>
{
private static final long serialVersionUID = 1L;
private int id;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
}
Когда этот объект десериализируется на стороне клиента мы получает просто инстанс
ArrayCollection. То есть мы получаем просто объект коллекции и, очевидно, поле id в процессе десериализации «теряется». Внимание вопрос. Как нам десериализовать объект без потерь?
Процессом сериализации можно управлять. Выше описанный способ простой и в простом проекте его достаточно. Вы не заботитесь о том как это происходит, вы просто говорите что объекты вашего класса могут быть сериализованы. И все. Но, как показано в определенной задаче, бывают случаи когда этого недостаточно. Это не «теоретическая» задача и проблема возникла на реальном проекте. Я просто упростил код. Также, решение этой задачи не есть что то экстраординарное.
Собственно решение.
В Java есть интерфейс
Externalizable. Этот интерфейс определяет только два метода:
public interface Externalizable extends java.io.Serializable {
void writeExternal(ObjectOutput out) throws IOException;
void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
}
Реализация этого интерфейса дает полный контроль над процессом сериализации. Вы определяете как объект будет прочитан или записан. Теперь перепишем немного серверный класс
public class MyList<Object> extends ArrayList<Object> implements Externalizable
{
private static final long serialVersionUID = 1L;
private int id;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
// допишите сами :)
}
public void writeExternal(ObjectOutput out) throws IOException
{
out.writeObject(new ArrayList<Object>(this));
out.writeInt(getId());
}
}
И создаем класс на стороне клиента
[RemoteClass(alias="com.test.MyList")]
public class MyList extends ArrayCollection implements IExternalizable
{
public var id:int;
public override function readExternal(input:IDataInput):void
{
this.list=ArrayCollection(input.readObject());
this.id=input.readInt();
}
public override function writeExternal(output:IDataOutput):void
{
//и тут тоже можете дописать сами :)
}
}
Обратите внимание на клиентский класс. Конкретно на
IExternalizable. Клиент должен знать как ему восстановить объект и реализация на стороне клиента интерфейса IExternalizable говорит как это сделать.
Все. Объект восстанавливается так как ожидается и никакие поля не теряются.
Комментарии (2)
RSS свернуть / развернутьк сожалению из спецов по флексу у нас пока только ты. хотелось бы статейку с конкретным примером для максимально простого применения. чтобы хоть как-то начать понимать для чего это всё. например, есть сайт, есть на нём немного флеша и как это всё вяжется с флексом (самый банальный пример с выводом заголовков RSS, авторизация, ...., что-нить простое и конкретное).
degtyarchuk
Простой пример? Ок. Сейчас сделаю. Только немного не стандартно чтобы было интересно разбирать с тем кому это интересно.
cyril
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.