использовать AMF вместо JSON на iPhone? (для веб-сервисов)

Хотя поддержка iPhone JSON исходно, AMF является протоколом двоичной синхронной передачи данных, и это предполагает для использования намного меньшего количества пропускной способности. Вы думаете с помощью AMF, хорошая идея?

Просто найденный этой библиотекой AMF в какао (Objective C): http://github.com/nesium/cocoa-amf/

Вот известный сравнительный тест, который показывает, что AMF меньше и быстрее, чем JSON + gzip в Flex: http://www.jamesward.com/census/

5
задан Henry 29 May 2010 в 17:56
поделиться

4 ответа

Вы можете взглянуть на буферы протокола Hessian или Google, если хотите использовать двоичный протокол. Я точно знаю, что hessian обеспечивает очень хорошую производительность на iPhone.

http://code.google.com/p/protobuf/

http://hessian.caucho.com/

2
ответ дан 18 December 2019 в 13:11
поделиться

Я не думаю, что AMF будет значительно меньше, чем JSON. Фактически, во многих случаях он может быть немного больше. Позвольте мне показать это на примере:

AMF хранит строку «asdf» в следующем двоичном формате:

0x12            /* type = string */
0x00 0x04       /* length */
'a' 's' 'd' 'f'
/* total: strlen(s)+3 bytes */

в то время как JSON хранит строку «asdf» в strlen (s) + 2 байта, если нет кавычек в нить.

AMF сохраняет объект JSON {"key1": "asdf", "key2": "foo"} в следующем двоичном формате:

0x03             /* type = object */
0x00 0x04        /* length of key1 */
'k' 'e' 'y' '1'
0x02             /* value type = string */
0x00 0x04        /* length of value1 */
'a' 's' 'd' 'f'
0x00 0x04        /* length of key2 */
'k' 'e' 'y' '2'
0x02             /* type of value2 */
0x00 0x03        /* length of value2 */
'f' 'o' 'o'
0x00 0x00 0x09   /* end of object */
/* total: 30 bytes, while the JSON string is 28 bytes */

Приведенные выше примеры были в AMF0, но я не Не думаю, что AMF3 будет сильно отличаться.

Единственная функция AMF0, которая может значительно уменьшить пропускную способность, - это то, что он содержит ссылочный тип: если вы отправите один и тот же большой объект дважды, второй объект будет только обратной ссылкой на первый экземпляр. Но это редкий случай ИМХО (и работает только для объектов, а не для строк).

Поэтому я бы порекомендовал JSON (если вы действительно хотите сэкономить байты, вы можете сжать его с помощью zlib или чего-то еще): его намного проще читать, существует гораздо больше реализаций, и спецификация ясна (в то время как реализация Flash иногда отличается от спецификации - всем нравится Adobe;))

6
ответ дан 18 December 2019 в 13:11
поделиться

Вы также можете попробовать plist , собственный двоичный формат. Любой формат, включая AMF или даже XML-список, может быть уменьшен с помощью zip. zlib является частью iPhone.

0
ответ дан 18 December 2019 в 13:11
поделиться

На самом деле это довольно хороший вопрос, и у меня он тоже есть. Сегодня на WWDC я присутствовал на сессии, где говорили о клиент/сервере с iPhone. И они говорили нам, что двоичные plist намного эффективнее, чем JSON и XML, особенно когда речь идет о времени разбора. Но проблема в том, что я все еще пытаюсь найти какую-либо серверную реализацию plist в качестве протокола удаленного доступа, в то время как AMF имеет множество отличных реализаций на стороне сервера: WebORB, ZendAMF, BlazeDS и т.д. Поэтому интегрировать AMF на стороне сервера - проще простого. К сожалению, на стороне клиента единственным вариантом, который я нашел, был Cocoa AMF от Nesium, но, к сожалению, он не поддерживает аутентификацию набора каналов и в нем отсутствует генератор заглушек на стороне клиента. Я бы рассмотрел этот вопрос, но поскольку это не маленькая задача, и я уверен, что многие разработчики iPhone уже столкнулись с этой проблемой, я хочу убедиться, что других вариантов действительно нет.

До сих пор я использовал Hessian с HessianKit, но он тоже не поддерживает аутентификацию, и это начинает ограничивать меня. Apple может сколько угодно говорить о Flash, но, по крайней мере, они делают подключение к удаленному серверу очень простым.

1
ответ дан 18 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: