Вопрос сериализации.

Серверная сторона- 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 говорит как это сделать.

Все. Объект восстанавливается так как ожидается и никакие поля не теряются.
  • 0
  • 23 июля 2010, 23:46
  • cyril

Комментарии (2)

RSS свернуть / развернуть
+
0
сюда ничего не надо дописать, чтобы можно было работать даже с какими-то отдельными элементами? (это я так, мысли вслух)
private int Id { get; set; }

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

degtyarchuk

  • 24 июля 2010, 08:11
+
0
Cергей, это просто «сеттер» и «геттер». Так как переменная обьявлена как private к ней нет прямого доступа даже если создать инстанс класса.
Простой пример? Ок. Сейчас сделаю. Только немного не стандартно чтобы было интересно разбирать с тем кому это интересно.
avatar

cyril

  • 24 июля 2010, 09:03

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Не забываем смотреть статистику:

Яндекс цитирования