Сериализация круговых объектных сетей с использованием writeObject / readObject - PullRequest
2 голосов
/ 07 октября 2011

Я собираюсь реализовать

public function writeExternal( output:IDataOutput ):void {...}
public function readExternal( input:IDataInput ):void {...}

, чтобы сделать сериализованный набор объектов.

Хотя я почти уверен, что все правильно реализовал, readExternal(..) в определенный момент жалуется на то, что осталось слишком мало данных для чтения:

RangeError: Error #2006: The supplied index is out of bounds.
    at flash.filesystem::FileStream/readObject()

Интересно, есть ли у меня круговая сеть объектов, подобная

A = { left -> B, right -> B }
B = { father -> A }

и я звоню

writeObject( a )

Сможет ли Flex сериализовать сеть объектов дыр и каждый объект только один раз?

Я сделал это:

  • Объявленные аннотации типа: [RemoteClass(alias="model.MyClass")]
  • Реализованные конструкторы без параметров
  • Объявлены все классы с использованием implements IExternalizable

SharedObject Метод send () гарантирует отправку каждого объекта один и только один раз.

Дополнительная информация:

Пожалуйста, посмотрите на этот связанный вопрос .

1 Ответ

0 голосов
/ 11 октября 2011

Мета [RemoteClass] - это инструкция и только для классов, используемых в проектах, которые компилятор Flex определяет как использующий среду Flex. По сути, это эквивалентно вызову registerClassAlias(MyClass, "model.MyClass");. По ряду причин, которые расширяют возможности этой темы, я бы предложил вместо этого использовать registerClassAlias.

Что касается встроенного модуля записи AMF, то его поведение выглядит следующим образом: если модуль записи получает все объекты, необходимые для записи за один раз (как в дереве, вы задаете ему корневой узел), затем он полностью запишет объект только один раз, в следующий раз, когда появится ссылка на этот объект, он будет использовать ссылку. Однако, если вы будете непрерывно передавать ему объекты, на которые уже могли ссылаться (например, через последовательные вызовы writeExternal), он будет обрабатывать каждый объект, как если бы он был новым. По крайней мере, теоретически, это должно работать и по-другому. То есть, если объекты были сериализованы по ссылке, после десериализации следует использовать ссылку. Это помогло бы увидеть больше вашего кода, особенно реализацию writeExternal и readExternal, чтобы дать лучший ответ.

...