[英]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上提供了非常好的性能。
实际上这是一个非常好的问题,我也有。 我参加了今天在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.