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

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

Только что нашел эту библиотеку AMF в какао (Objective-C): http://github.com/nesium/cocoa-amf/

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

Ответы [ 5 ]

6 голосов
/ 29 мая 2010

Я не думаю, что 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;))

5 голосов
/ 04 января 2011

Тренажерный зал сказал:

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

Это НАСТОЛЬКО неверно. AMF3 может давать в 5–8 раз меньше данных, чем AMF / JSON. AMF3 достигает этого, ссылаясь на каждый элемент, который использовался один раз. Не только строки. На любой объект, , включая ключи , ссылаются (со смещением), как только он используется один раз.

На больших наборах данных это имеет огромное значение.

2 голосов
/ 29 мая 2010

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

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

http://hessian.caucho.com/

1 голос
/ 10 июня 2010

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

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

0 голосов
/ 29 мая 2010

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

...