2010-05-29 59 views
5

儘管iPhone本身支持JSON,但AMF是一種二進制協議,它假定使用的帶寬要少得多。你認爲使用AMF是一個好主意嗎?在iPhone上使用AMF而不是JSON? (用於Web服務)

剛剛發現在可可這個AMF庫(Objective-C的):http://github.com/nesium/cocoa-amf/

這裏是著名的標杆,顯示AMF更小並且比JSON更快+ gzip的Flex中:http://www.jamesward.com/census/

+0

這當然取決於您傳輸的數據。我需要創建一個小型人口普查應用程序,它可以處理更小的數據。 :) – 2010-12-17 13:40:57

+1

請確保你閱讀@ user562816答案,AMF3應該小很多。 – 2011-10-18 02:41:06

回答

5

健身房說:

上面的例子是在AMF0,但我不認爲AMF3將大大不同。

這是不真實的。 AMF3可以產生比AMF/JSON少5到8倍的數據。 AMF3通過參考已經使用過的每一個單品來實現這一點。不僅是字符串。任何對象,包括密鑰,,只要使用過一次,都會被引用(帶有偏移量)。

在大型數據集上,它會產生巨大的差異。

+0

這裏非常重要的區別。 AM3在這裏應該被標記爲正確的答案...嗯,不知道我是否可以編輯答案? – 2011-10-18 02:40:24

0

您也可以嘗試plist ,一種原生的二進制格式。任何格式,包括AMF甚至XML plist,都可以通過壓縮縮小。 zlib是iPhone的一部分。

+1

thx,但plist不適用於大多數Web服務器。 – Henry 2010-05-29 01:58:30

+2

您應該在您的問題中添加足夠的細節以明確您的需求。模糊的問題會得到模糊的答案。最初,使用AMF的唯一原因是爲了減少帶寬,在這種情況下,使用zip的plist是更好的選擇。 – drawnonward 2010-05-29 03:29:18

+0

我明白了,我沒有把你的答案投下來。 – Henry 2010-05-29 04:15:17

6

我不認爲AMF會比JSON小得多。事實上,在許多情況下它可能會稍大一些。讓我在一個例子表明這一點:在下面的二進制格式

AMF存儲字符串「ASDF」:

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

而JSON存儲的strlen(S)+ 2個字節的字符串「ASDF」如果有在字符串中沒有引號。

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;))

+0

有趣!謝謝。 – Henry 2010-05-29 17:46:56

+0

但不是通過HTTP更高效地以文本方式傳輸二進制文件? – Henry 2010-05-29 17:57:51

+0

根本不是!也許你所指的是_HTML form_的文本數據是由瀏覽器編碼的URL(例如,它將空格字符轉義爲%20),這增加了長度。但不需要通過HTTP以這種方式發送數據。無論如何,文本字符是「二進制字符」的子集(數字在0-255之間),所以如果您將文本作爲二進制數據發送,它不會比「真正的」二進制數據花費更多! (實際上,只有相反的情況會發生:有些協議要求數據以ASCII字符發送,所以二進制數據必須解壓到7位範圍......) – gyim 2010-05-29 18:44:45

1

其實這是一個非常好的問題,我有這一點。今天我在WWDC參加了一個會議,談論有關iPhone的客戶端/服務器。他們一直告訴我們二進制plist比JSON和XML更有效率,尤其是在解析時間方面。但問題是,我仍然試圖找到plist的任何服務器端實現作爲遠程協議,而AMF在服務器端有很多優秀的實現:WebORB,ZendAMF,BlazeDS等。因此,AMF在服務器端是一件輕而易舉的事。不幸的是,在客戶端,我發現的唯一選擇是Nesium的Cocoa AMF,但不幸的是它不支持通道集認證,並且它錯過了客戶端存根生成器。我會研究它,但由於這不是一項小任務,我相信很多iPhone開發人員已經面臨這個問題,我想確保沒有其他選擇。到目前爲止,我一直使用HessianKit的Hessian,但它不支持身份驗證,它開始是一個限制。蘋果可以說他們想要的所有關於Flash的東西,但至少他們可以很容易地連接到遠程服務器。

+0

沒有Java實現的plist呢?也許是時候開始一個開源項目了。 :) – Henry 2010-06-10 20:06:42