2010-05-29 1 views
5

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

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

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

+0

Это, безусловно, зависит от данных, которые вы передаете. Мне нужно создать приложение для мини-переписей, которое выполняет меньшие наборы данных. :) –

+1

Убедитесь, что вы читаете @ user562816 ответ, AMF3 должен быть намного меньше. –

ответ

5

Gym сказал:

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

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

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

+0

очень важный разница здесь. AM3 должен быть помечен как правильный ответ здесь ... hmm интересно, могу ли я отредактировать ответ? –

0

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

+1

thx, но plist не работает хорошо с большинством веб-серверов. – Henry

+2

Вы должны добавить достаточно подробностей на свой вопрос, чтобы ваши требования были четкими. Неясные вопросы дают неопределенные ответы. Первоначально, единственной причиной использования AMF было сокращение полосы пропускания, и в этом случае plist с zip является лучшим выбором. – drawnonward

+0

Я понимаю, я не проголосовал за ваш ответ. – Henry

6

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

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

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

в то время как JSON хранит строку «ASDF» в STRLEN (ы) + 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, которая может значительно уменьшить пропускную способность, состоит в том, что она содержит ссылочный тип: если вы отправляете один и тот же большой объект дважды, второй объект будет только обратной ссылкой на первый экземпляр. Но это редкий случай IMHO (и он работает только для объектов, а не для строк).

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

+0

ИНТЕРЕСНО! Благодарю. – Henry

+0

, но не переносит бинарный HTTP более эффективный, чем текст? – Henry

+0

Совсем нет! Возможно, речь идет о том, что текстовые данные формы _HTML_ URL кодируются браузером (например, он пропускает символ пробела до% 20), что увеличивает длину. Но не нужно отправлять данные таким образом через HTTP. И вообще, текстовые символы являются подмножеством «двоичных символов» (цифры между 0-255), поэтому, если вы отправляете текст в виде двоичных данных, он не может стоить больше, чем «реальные» двоичные данные! (на самом деле может произойти только противоположное: некоторым протоколам требуется, чтобы данные отправлялись в ASCII-символах, поэтому двоичные данные должны быть распакованы в 7-битный диапазон ...) – gyim

2

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

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

http://hessian.caucho.com/

1

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

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

+0

нет реализации Java plist еще? возможно, пришло время начать проект с открытым исходным кодом. :) – Henry