虽然 iPhone 本身支持 JSON,但 AMF 是一个二进制协议,它应该使用更少的带宽。您认为使用 AMF 是个好主意吗?
刚刚在可可(Objective-C)中找到了这个 AMF 库:http: //github.com/nesium/cocoa-amf/
这是一个著名的基准,它显示 AMF 在 Flex 中比 JSON + gzip 更小更快:http ://www.jamesward.com/census/
虽然 iPhone 本身支持 JSON,但 AMF 是一个二进制协议,它应该使用更少的带宽。您认为使用 AMF 是个好主意吗?
刚刚在可可(Objective-C)中找到了这个 AMF 库: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{"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 */
上面的例子是在 AMF0 中,但我认为 AMF3 不会有太大的不同。
AMF0 中唯一可以显着降低带宽的特性是它包含一个引用类型:如果您将同一个大对象发送两次,那么第二个对象将只是对第一个实例的反向引用。但恕我直言,这是一种罕见的情况(它仅适用于对象,不适用于字符串)。
所以我会推荐JSON(如果你真的想节省字节,你可以用zlib或任何东西来压缩它):它更容易阅读,有更多的实现,规范很明确(虽然Flash的实现有时不同从规范 - 我们都喜欢 Adobe ;))
健身房 说道:
上面的例子是在 AMF0 中,但我认为 AMF3 不会有太大的不同。
这太不真实了。AMF3 可以产生比 AMF/JSON 少 5 到 8 倍的数据。AMF3 通过引用每一个使用过一次的项目来实现这一点。不仅是字符串。任何对象,包括 keys,只要被使用一次就会被引用(带有偏移量)。
在大型数据集上,它会产生巨大的差异。
如果您想使用二进制协议,您可以查看 Hessian 或 Google 协议缓冲区。我知道粗麻布在 iPhone 上提供了非常好的性能。
其实这是一个很好的问题,我也有。我今天在 WWDC 上参加了一个关于 iPhone 客户端/服务器的会议。他们不断告诉我们二进制 plist 比 JSON 和 XML 更有效,尤其是在解析时间方面。但问题是我仍在尝试寻找任何 plist 的服务器端实现作为远程协议,而 AMF 在服务器端有很多很棒的实现:WebORB、ZendAMF、BlazeDS 等。所以在服务器端轻而易举。不幸的是,在客户端,我发现的唯一选择是 Nesium 的 Cocoa AMF,但不幸的是它不支持通道集身份验证,并且它缺少客户端存根生成器。我会调查它,但由于这不是一项小任务,而且我相信很多 iPhone 开发人员已经面临这个问题,
到目前为止,我一直在将 Hessian 与 HessianKit 一起使用,但它也不支持身份验证,并且开始成为一种限制。Apple 可以说他们想要的关于 Flash 的一切,但至少它们使连接到远程服务器变得非常容易。
您也可以尝试plist,一种原生二进制格式。任何格式,包括 AMF 甚至 XML plist,都可以通过 zip 压缩。zlib 是 iPhone 的一部分。