繁体   English   中英

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

[英]use AMF instead of JSON on iPhone? (for web services)

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

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

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

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

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

健身房说:

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

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

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

如果要使用二进制协议,可以查看Hessian或Google协议缓冲区。 我知道hessian在iPhone上提供了非常好的性能。

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

http://hessian.caucho.com/

实际上这是一个非常好的问题,我也有。 我参加了今天在WWDC上与iPhone讨论客户端/服务器的会议。 他们一直告诉我们二进制plist比JSON和XML效率更高,特别是在解析时间方面。 但问题是我仍然试图找到plist作为远程协议的任何服务器端实现,而AMF在服务器端有很多很棒的实现:WebORB,ZendAMF,BlazeDS等。所以将AMF集成在服务器端是轻而易举的。 不幸的是,在客户端,我找到的唯一选择是Nesium的Cocoa AMF,但不幸的是它不支持通道集认证,它错过了客户端存根生成器。 我会调查它,但由于这不是一个小任务,我相信很多iPhone开发人员已经面临这个问题,我想确保没有其他选择。

到目前为止,我一直在使用Hessian和HessianKit,但它也不支持身份验证,并且它开始成为一个限制。 Apple可以说他们想要的所有Flash,但至少他们可以很容易地连接到远程服务器。

您还可以尝试plist ,一种原生二进制格式。 任何格式,包括AMF甚至XML plist,都可以通过zip减少。 zlib是iPhone的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM