在iPhone上使用AMF而不是JSON?(用于Web服务)

Hen*_*nry 5 apache-flex iphone json actionscript amf

尽管iPhone本身支持JSON,但AMF是一种二进制协议,它假设使用的带宽要少得多.您认为使用AMF是个好主意吗?

刚刚在可可中发现了这个AMF库(Objective-C):http://github.com/nesium/cocoa-amf/

这是着名的基准测试,显示AMF比Flex中的JSON + gzip更小更快:http://www.jamesward.com/census/

gyi*_*yim 6

我不认为AMF会比JSON小得多.实际上,在许多情况下它可能略大一些.让我在一个例子中展示这个:

AMF以下面的二进制格式存储字符串"asdf":

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

如果字符串中没有引号,则JSON将字符串"asdf"存储在strlen(s)+ 2个字节中.

AMF {"key1":"asdf","key2":"foo"}以下面的二进制格式存储JSON对象:

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 */
Run Code Online (Sandbox Code Playgroud)

上面的例子是在AMF0,但我不认为AMF3会有太大的不同.

AMF0中唯一可以显着减少带宽的功能是它包含一个引用类型:如果两次发送相同的大对象,则第二个对象将只是对第一个实例的反向引用.但它是一种罕见的情况恕我直言(它只适用于对象,而不是字符串).

所以我建议使用JSON(如果你真的想节省字节,你可以用zlib或其他东西来压缩它):它更简单易读,有更多的实现,而且规范很明确(虽然Flash实现有时不同从规范 - 我们都喜欢Adobe;))

  • 只是一点,因为这个答案可能会产生误导 - 你可能已经证明了JSON比AMF更有效的情况,即发送字符串(并且它有时更好,因为AMF3使用对相同字符串的引用).在大型对象集上,AMF3在开始时发送类结构,而不仅仅是二进制格式的数据,而JSON再次重新发送字段名称,并再次作为字符串重新发送.即使在发送数字这样的简单常见情况下,AMF也会胜出,例如"1234567890"将被写为JSON中的字符串,但对于AMF int,它将是80位而不是32位. (4认同)

Dom*_*TTI 5

健身房说:

上面的例子是在AMF0,但我不认为AMF3会有太大的不同.

这是不真实的.AMF3可以使数据比AMF/JSON少5到8倍.AMF3通过引用曾经使用过的每一件物品来实现这一目标.不仅是字符串.只要使用一次,任何对象(包括键)都会被引用(带偏移量).

在大型数据集上,它会产生巨大的差异.