2010-05-29 12 views
5

Obwohl das iPhone JSON nativ unterstützt, ist AMF ein binäres Protokoll, das viel weniger Bandbreite benötigt. Denkst du AMF zu benutzen ist eine gute Idee?Verwenden Sie AMF anstelle von JSON auf dem iPhone? (für Web-Dienste)

gefunden Gerade diese AMF-Bibliothek in Kakao (Objective-C): http://github.com/nesium/cocoa-amf/

Hier ist der berühmte Benchmark, die AMF zeigt ist kleiner und schneller als JSON + gzip in Flex: http://www.jamesward.com/census/

+0

Es hängt sicherlich von den Daten ab, die Sie übertragen. Ich muss eine Mini-Census-App erstellen, die kleinere Datensätze erstellt. :) –

+1

Stellen Sie sicher, dass Sie @ user562816 Antwort lesen, sollte AMF3 viel kleiner sein. –

Antwort

5

Gym sagte:

Die obigen Beispiele in AMF0 waren, aber ich glaube nicht, AMF3 viel anders sein würde.

Das ist SO unwahr. AMF3 kann Daten so viel wie 5 bis 8 mal weniger als AMF/JSON ergeben. AMF3 erreicht dies, indem es jedes einzelne Element referenziert, das einmal verwendet wurde. Nicht nur Saiten. Jedes Objekt, , einschließlich der Schlüssel, wird (sobald es einmal verwendet wurde) mit einem Offset referenziert.

Bei großen Datensätzen macht es einen großen Unterschied.

+0

sehr wichtiger Unterschied hier. AM3 sollte hier als richtige Antwort markiert sein ... hmm, frage mich, ob ich die Antwort bearbeiten kann? –

0

Sie auch plist könnten versuchen, , ein natives Binärformat. Jedes Format, einschließlich AMF oder sogar XML-Plist, könnte durch zip reduziert werden. zlib ist Teil des iPhone.

+1

thx, aber plist funktioniert nicht gut mit den meisten Webservern. – Henry

+2

Sie sollten Ihrer Frage genügend Details hinzufügen, um Ihre Anforderungen zu verdeutlichen. Vage Fragen bekommen vage Antworten. Anfangs war der einzige Grund für die Verwendung von AMF die Reduzierung der Bandbreite. In diesem Fall ist plist mit zip die bessere Wahl. – drawnonward

+0

Ich verstehe, ich habe Ihre Antwort nicht abgegeben. – Henry

6

Ich glaube nicht, AMF wäre wesentlich kleiner als JSON. In der Tat kann es in einigen Fällen etwas größer sein. Lassen Sie mich diese zeigen in einem Beispiel:

AMF speichert die Zeichenfolge "asdf" im folgenden Binärformat:

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

während JSON speichert die Zeichenfolge "asdf" in strlen (s) + 2 Bytes, wenn es sind keine Anführungszeichen in der Zeichenfolge.

AMF speichert das JSON-Objekt {"key1":"asdf","key2":"foo"} im folgenden Binärformat:

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 */ 

Die obigen Beispiele in AMF0 waren, aber ich glaube nicht, AMF3 viel anders sein würde. Die einzige Funktion in AMF0, die die Bandbreite erheblich reduzieren kann, ist, dass sie einen Referenztyp enthält: Wenn Sie dasselbe große Objekt zweimal senden, ist das zweite Objekt nur eine Rückreferenz auf die erste Instanz. Aber es ist ein seltener Fall IMHO (und es funktioniert nur für Objekte, nicht für Strings).

Also ich würde JSON empfehlen (wenn Sie wirklich auf Bytes sparen wollen, können Sie es mit zlib oder irgendetwas komprimieren): es ist viel einfacher zu lesen, es gibt viel mehr Implementierungen, und die Spezifikation ist klar (während der Flash Implementierung unterscheidet sich manchmal von der Spezifikation - wir alle mögen Adobe;))

+0

INTERESSANT! Vielen Dank. – Henry

+0

aber transportiert binär über HTTP nicht irgendwie effizienter als Text? – Henry

+0

Überhaupt nicht! Vielleicht beziehen Sie sich darauf, dass die Textdaten eines _HTML-Formulars_ vom Browser URL-codiert sind (Leerzeichen wie zB% 20), was die Länge erhöht. Es ist jedoch nicht erforderlich, Daten über HTTP zu senden. Wie auch immer, Textzeichen sind die Untermenge von "Binärzeichen" (Zahlen zwischen 0-255). Wenn Sie also einen Text als Binärdaten senden, kann es nicht mehr kosten als "echte" Binärdaten! (Tatsächlich kann nur das Gegenteil passieren: einige Protokolle erfordern, dass die Daten in ASCII-Zeichen gesendet werden, so dass die Binärdaten in den 7-Bit-Bereich entpackt werden müssen ...) – gyim

1

Eigentlich ist es eine ziemlich gute Frage und ich habe es auch. Ich besuchte heute eine Sitzung auf der WWDC über Client/Server mit iPhone. Und sie sagten uns, dass binary plist viel effizienter sei als JSON und XML, besonders wenn es um die Zeitanalyse geht. Aber das Problem ist, dass ich immer noch versuche, irgendeine serverseitige Implementierung von plist als Remoting-Protokoll zu finden, während AMF viele großartige Implementierungen auf der Serverseite hat: WebORB, ZendAMF, BlazeDS, etc. Serverseite ist ein Kinderspiel. Leider war auf der Client-Seite die einzige Option, die ich fand, Nesium Cocoa AMF, aber leider unterstützt es keine Channel-Set-Authentifizierung und es fehlt ein clientseitiger Stub-Generator. Ich würde mich darum kümmern, aber da dies keine kleine Aufgabe ist und ich bin mir sicher, dass viele iPhone-Entwickler bereits mit diesem Problem konfrontiert sind, möchte ich sicherstellen, dass es wirklich keine anderen Optionen gibt.

Bis jetzt habe ich Hessian mit HessianKit benutzt, aber es unterstützt auch keine Authentifizierung und es fängt an, eine Einschränkung zu sein.Apple kann über Flash alles sagen, was sie wollen, aber zumindest machen sie es sehr einfach, sich mit einem Remote-Server zu verbinden.

+0

keine Java-Implementierung von PLIST noch? Vielleicht ist es Zeit, ein Open-Source-Projekt zu starten. :) – Henry