5

iPhone はネイティブで JSON をサポートしていますが、AMF はバイナリ プロトコルであり、使用する帯域幅がはるかに少ないと想定されています。AMF を使用することは良い考えだと思いますか?

ココア (Objective-C) でこの AMF ライブラリを見つけました: http://github.com/nesium/cocoa-amf/

AMF が Flex の JSON + gzip よりも小さく高速であることを示す有名なベンチマークは次のとおりです: http://www.jamesward.com/census/

4

5 に答える 5

6

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 の唯一の機能は、参照タイプが含まれていることです。同じ大きなオブジェクトを 2 回送信すると、2 番目のオブジェクトは最初のインスタンスへの後方参照になります。しかし、それはまれなケースです(文字列ではなく、オブジェクトに対してのみ機能します)。

したがって、JSONをお勧めします(本当にバイトを節約したい場合は、zlibなどで圧縮できます):読みやすく、実装がはるかに多く、仕様が明確です(Flashの実装は異なる場合があります)仕様から - 私たちは皆 Adob​​e が好きです ;))

于 2010-05-29T09:23:01.807 に答える
5

ジムは言った:

上記の例はAMF0にありましたが、AMF3はそれほど変わらないと思います。

これはとても真実ではありません。AMF3は、AMF / JSONの5〜8分の1のデータになる可能性があります。AMF3は、一度使用されたすべてのアイテムを参照することでこれを実現します。文字列だけではありません。キーを含むすべてのオブジェクトは、一度使用されるとすぐに(オフセット付きで)参照されます。

大規模なデータセットでは、大きな違いがあります。

于 2011-01-04T16:36:21.860 に答える
2

バイナリプロトコルを使用する場合は、HessianまたはGoogleのプロトコルバッファを確認してください。事実、hessianはiPhoneで非常に優れたパフォーマンスを提供することを知っています。

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

http://hessian.caucho.com/

于 2010-05-29T18:47:19.973 に答える
1

実際、それはかなり良い質問であり、私もそれを持っています。私は今日WWDCでのセッションに参加し、iPhoneを使用したクライアント/サーバーについて話しました。そして彼らは、特に解析時間に関しては、バイナリplistはJSONやXMLよりもはるかに効率的であると言い続けました。しかし、問題は、リモートプロトコルとしてplistのサーバー側の実装を見つけようとしているのに対し、AMFにはサーバー側にWebORB、ZendAMF、BlazeDSなどの優れた実装がたくさんあることです。サーバー側は簡単です。残念ながら、クライアント側では、私が見つけた唯一のオプションはNesiumのCocoa AMFでしたが、残念ながら、チャネルセット認証をサポートしておらず、クライアント側のスタブジェネレーターがありません。私はそれを調べますが、これは簡単な作業ではなく、多くのiPhone開発者がすでにその問題に直面していると確信しているので、

これまで、HessianKitでHessianを使用してきましたが、認証もサポートしておらず、制限があり始めています。Appleは、Flashについて望むことをすべて言うことができますが、少なくとも、リモートサーバーへの接続を非常に簡単にします。

于 2010-06-10T01:42:18.063 に答える
0

ネイティブのバイナリ形式であるplistを試すこともできます。AMF や XML plist を含む任意の形式を zip で圧縮できます。zlib は iPhone の一部です。

于 2010-05-29T01:54:53.747 に答える