2010-05-29 12 views
5

Chociaż iPhone obsługuje JSON natywnie, AMF jest protokołem binarnym i zakłada użycie znacznie mniejszej przepustowości. Czy uważasz, że używanie AMF to dobry pomysł?używać AMF zamiast JSON na iPhonie? (dla usług sieciowych)

Wystarczy znaleźć ten AMF bibliotekę w kakao (Objective-C): http://github.com/nesium/cocoa-amf/

Oto słynny punkt odniesienia, który pokazuje AMF jest mniejszy i szybszy niż JSON + gzip w Flex: http://www.jamesward.com/census/

+0

Zależy to oczywiście od danych, które przesyłasz. Muszę utworzyć mini-aplikację Census, która wykonuje mniejsze zestawy danych. :) –

+1

Upewnij się, że czytasz odpowiedź @ user562816, AMF3 powinno być o wiele mniejsze. –

Odpowiedz

5

Gym powiedział:

Powyższe przykłady były w AMF0, ale nie sądzę AMF3 byłoby zupełnie inaczej.

To nieprawda. AMF3 może spowodować dane aż 5 do 8 razy mniejsze niż AMF/JSON. AMF3 osiąga to przez odniesienie do każdego pojedynczego elementu, który był użyty jeden raz. Nie tylko struny. Każdy obiekt, , w tym klucze, jest przywoływany (z przesunięciem), jak tylko został użyty jeden raz.

W przypadku dużych zestawów danych robi wielką różnicę.

+0

bardzo ważna różnica tutaj. AM3 powinno być zaznaczone jako poprawna odpowiedź tutaj ... hmm zastanawiam się, czy mogę edytować odpowiedź? –

0

Można również spróbować plist , natywny format binarny. Dowolny format, w tym AMF lub nawet plik plist XML, może być zmniejszony do zip. zlib jest częścią iPhone'a.

+1

thx, ale plist nie działa dobrze z większością serwerów WWW. – Henry

+2

Powinieneś dodać wystarczająco dużo szczegółów do swojego pytania, aby jasno określić swoje wymagania. Niejasne pytania dają niejasne odpowiedzi. Początkowo jedynym powodem używania AMF było zmniejszenie przepustowości, w którym to przypadku plist z suwakiem jest lepszym wyborem. – drawnonward

+0

Rozumiem, nie głosowałem na twoją odpowiedź. – Henry

6

Nie sądzę, że AMF byłby znacznie mniejszy niż JSON. W rzeczywistości może być nieco większy w wielu przypadkach. Pokażę to na przykładzie:

AMF sklepów ciąg „asdf” w następującym formacie binarnym:

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

podczas JSON przechowuje ciąg „asdf” w strlen (s) + 2 bajty, jeśli istnieje nie ma cudzysłowów w ciągu znaków.

AMF przechowuje obiekt JSON {"key1":"asdf","key2":"foo"} w następującym formacie binarnym:

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

Powyższe przykłady były w AMF0, ale nie sądzę AMF3 byłoby zupełnie inaczej.

Jedyną funkcją w AMF0, która może znacznie zmniejszyć szerokość pasma, jest to, że zawiera typ odniesienia: jeśli dwa razy ten sam duży obiekt zostanie wysłany, drugi obiekt będzie tylko odwołaniem do pierwszej instancji. Ale jest to rzadki przypadek IMHO (i działa tylko dla obiektów, a nie dla łańcuchów).

Polecam JSON (jeśli naprawdę chcesz zaoszczędzić na bajtach, możesz skompresować go za pomocą zlib lub cokolwiek): jest to znacznie prostsze do odczytania, jest znacznie więcej implementacji, a specyfikacja jest jasna (podczas gdy Flash implementacja czasami różni się od specyfikacji - wszyscy lubimy Adobe;))

+0

CIEKAWE! Dzięki. – Henry

+0

, ale czy przenoszenie danych binarnych przez HTTP nie jest tak wydajne jak tekst? – Henry

+0

Wcale nie! Być może chodzi o to, że dane tekstowe formularza _HTML są adresami URL zakodowanymi przez przeglądarkę (na przykład uwalniają znak spacji do% 20), co zwiększa długość. Ale nie jest konieczne wysyłanie danych w ten sposób przez HTTP. W każdym razie, znaki tekstowe są podzbiorem "znaków binarnych" (liczby od 0-255), więc jeśli wyślesz tekst jako dane binarne, to nie może kosztować więcej niż "prawdziwe" dane binarne! (w rzeczywistości może się zdarzyć tylko coś odwrotnego: niektóre protokoły wymagają, aby dane były wysyłane w postaci znaków ASCII, więc dane binarne muszą zostać rozpakowane do zakresu 7-bitowego ...) – gyim

1

Właściwie to całkiem dobre pytanie i mam go zbyt. Uczestniczyłem dzisiaj w sesji podczas WWDC, rozmawiając o kliencie/serwerze z iPhonem. I ciągle nam mówili, że binarny plist był znacznie bardziej wydajny niż JSON i XML, szczególnie jeśli chodzi o czas analizowania. Problem polega jednak na tym, że wciąż próbuję znaleźć dowolną wersję plistu jako protokołu zdalnego, podczas gdy AMF ma wiele świetnych implementacji po stronie serwera: WebORB, ZendAMF, BlazeDS itd. W ten sposób integrując AMF na strona serwera to pestka. Niestety, po stronie klienta jedyną opcją, którą znalazłem, było NEAium Cocoa AMF, ale niestety nie obsługuje uwierzytelniania zestawu kanałów i pomija generator numeru pośredniego po stronie klienta. Zajrzałbym do tego, ale ponieważ to nie jest małe zadanie i jestem pewien, że wielu programistów iPhone'a już miało ten problem, chcę się upewnić, że naprawdę nie ma innych opcji.

Do tej pory używałem hessian z HessianKit, ale nie obsługuje ono również uwierzytelniania i zaczyna być ograniczeniem.Apple może powiedzieć wszystko, co chcą o Flash, ale przynajmniej sprawiają, że bardzo łatwo jest połączyć się ze zdalnym serwerem.

+0

Nie ma jeszcze implementacji plistu Java? może czas zacząć projekt open source. :) – Henry

Powiązane problemy