Flash: AMF3 со справочными таблицами? - PullRequest
5 голосов
/ 15 марта 2009

Спецификация AMF3 определяет использование так называемых «справочных таблиц» (см. Раздел 2.2 настоящей спецификации).

Я реализовал это поведение в своем кодере / декодере AMF3, который я разработал в Erlang, но, не имея большого опыта работы с Flash API, я с трудом могу найти, как легко заставить Flash использовать эти справочные таблицы при сериализации объектов в AMF3; например, если я использую ByteArray, кажется, что он просто повторяет полную кодировку объекта

 var ba:ByteArray = new ByteArray();
 ba.writeObject("some string1");
 ba.writeObject("some string1");
 # =>
 # <<6,25,115,111,109,101,32,115,116,114,105,110,103,49,
 #   6,25,115,111,109,101,32,115,116,114,105,110,103,49>>

(что явно является повторением).

Однако, если эти две строки находятся в одном вызове writeObject, он, похоже, использует ссылки:

 ba.writeObject(["some string1", "some string1"]);
 # => <<9,5,1,6,25,115,111,109,101,32,115,116,114,105,110,103,49,6,0>>

Сокет, кажется, ведет себя так же.

Итак, можно ли использовать справочные таблицы во Flash-коде? (при условии, что может иметь нестандартный протокол между приложением Flash и сервером)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 марта 2009

Я думаю, что разница в том, что в первом примере вы пишете два строковых литерала. Во втором примере вы пишете массив (или сложный объект в спецификациях Adobe), который имеет ссылку на две строки. Так что если вы ссылаетесь на строку из объекта или массива, она запишет ее в таблицу ссылок.

Это не обязательно способ принудительного применения, но кажется логичным, что сериализатор AMF, встроенный во флэш-память, будет сериализовывать объекты таким образом, так что это, вероятно, надежный способ получить желаемое поведение (строки справочной таблицы). *

Я надеюсь, что это полезно для вас!

1 голос
/ 13 октября 2009

Согласно последнему предложению спецификации AMF3 ( Спецификация AMF 3.0 на Adobe.com ):

Также обратите внимание, что ByteArray использует новый набор неявных ссылочных таблиц для объектов, признаков объекта и строк для каждого вызова readObject и writeObject.

Похоже, что намерение с ByteArray.writeObject состоит в том, чтобы создать сериализацию, которая могла бы быть сохранена или восстановлена ​​для каждого объекта.

Поведение объекта NetConnection похоже на то, на что вы рассчитывали.

При обновлении таблицы ссылок на строки важно не добавлять пустые строки в таблицу ссылок.

При ведении таблицы ссылок на объекты вы можете реализовать защитное программирование следующим образом: таблица ссылок на объекты создается рекурсивно и иногда содержит объекты, для которых признаки еще не полностью известны. Если индексы таблицы не распределены заранее, нумерация будет несовместимой между приложениями. Декодер AMF3 не должен использовать признаки частично построенного объекта - такой ввод должен быть помечен как ошибочный.

Таблица ссылок на строки реализуется в кодере путем «пометки» строковых объектов в памяти по мере их сериализации. Кодирование двух разных строковых объектов с одинаковым содержимым (совпадающих строк), по-видимому, не кодируется одной строкой, ссылающейся на другую. Обе строки будут выведены, и строка по ссылке не будет использоваться.

Там может быть решение вашего первоначального вопроса. Если у вас есть несколько объектов, принадлежащих к одному и тому же классу, и вы хотите хранить все эти объекты в одном хранилище, я предлагаю следующее: Создайте «родительский объект» со ссылками на все объекты, которые вы намерены хранить. Затем используйте ByteArray.writeObject, чтобы сохранить этот родительский объект. AMF закодирует все упомянутые объекты и будет эффективно представлять черты повторяющихся классов объектов.

0 голосов
/ 15 августа 2009

Посмотрите на последнюю страницу официальной спецификации AMF3, и вы увидите, что ByteArray практически ничего не стоит. Вам придется написать свой собственный сериализатор / десериализатор AMF3.

...