【发布时间】:2011-01-15 11:52:56
【问题描述】:
我正在编写一个与外部服务器通信的简单应用程序。 服务器目前支持 yaml、xml 和 json。
- 哪种编码在 iPhone 上最快?
- 哪个支持更好?
- 您建议使用哪些库?
【问题讨论】:
标签: iphone xml cocoa-touch json yaml
我正在编写一个与外部服务器通信的简单应用程序。 服务器目前支持 yaml、xml 和 json。
【问题讨论】:
标签: iphone xml cocoa-touch json yaml
我为 iPhone OS 3.0 创建了一个开源应用程序,展示了如何在 iPhone 应用程序中使用 REST 和 SOAP 服务,使用 XML(使用 8 个不同的 iPhone 库)、SOAP、JSON(使用 SBJSON 和 TouchJSON)、YAML、协议缓冲区(Google 序列化格式),甚至来自 PHP 示例应用程序(包含在项目中)的 CSV。
http://github.com/akosma/iPhoneWebServicesClient
该项目的模块化程度足以在未来支持许多其他格式和库。
SlideShare 中的以下演示文稿展示了我在性能、易于实施和有效负载特征方面的发现:
http://www.slideshare.net/akosma/web-services-3439269
基本上我发现,在我的测试中,Binary Plists + REST + JSON 和 XML + TBXML 库是“最佳”选项(意思是:易于实现 + 反序列化速度 + 最低负载大小)。
在 Github 项目中,有一个“结果”文件夹,其中包含一个总结结果的 Excel 表格(以及所有原始数据)。您也可以自己启动测试,使用 3G 或 wifi,然后将结果邮寄给自己进行比较和研究。
希望对你有帮助!
【讨论】:
IF您可以在您的 iPhone 项目中使用 c++ 库,然后请查看yaml-cpp:
http://code.google.com/p/yaml-cpp/
【讨论】:
Objective-C 支持所有三种格式。只是谷歌他们。我建议编写一个支持所有这三个的序列化程序。只需让您的 URL 资源请求以 .xml|.json|.yaml 结尾,并让服务器根据该扩展名决定要序列化的内容。然后你实际上不必决定你可以切换到你想要的任何东西。在大多数服务器端实现中,使序列化程序可插入非常容易。
【讨论】:
我有一些基准来比较这里可用的不同序列化程序的性能和负载大小:
基本上,如果您使用 .NET Web 服务进行开发,那么您将在负载大小与性能之间做出妥协,除非您使用另一个序列化程序。
Marc 的 protobuf-net 展示了最小和最快的实现:
虽然是二进制协议,但调试起来可能比较困难。
如果您使用 MonoTouch(即 iPhone 的 C#/Mono)进行开发并希望使用基于文本的格式,那么您可能会对我的 Javascript-like type serializer 感兴趣,该Javascript-like type serializer 已针对大小和速度进行了优化,它也显示出适度优于可用的 XML 和 JSON 选项,即:
这里有一个 MonoTouch 教程,展示了如何从 iPhone 调用 Web 服务: http://www.servicestack.net/monotouch/remote-info/
【讨论】:
使用json-framework,让您的类与 JSON 互操作非常简单。
【讨论】:
我没有看到任何 YAML 库(尽管这并不意味着没有)。我知道 TouchJSON 效果很好,而且至少还有一个。
与 XML 或 PLIST 提要相比,JSON 占用的空间更少,但需要提前多考虑以使结构正确。
pLists 的一个很好的方面是您无需解析即可将日期作为对象返回。如果您在 JSON 中传递日期,请确定格式并在任何地方使用相同的格式。 NSDateFormatter 不是线程安全的,因此如果您想使用单个日期格式化程序来节省资源,则必须为每个线程创建一个实例。
【讨论】:
我参与了一个项目,该项目将运行 J2ME 的摩托罗拉手机与网络中的语音服务器连接起来。我们发现总带宽值得优化(这是在 2004 年的 2.5G 网络上)。所以我建议你测量每种序列化格式需要多少字节,然后选择较小的(JSON 或 YAML)。您甚至可以考虑使用像 Hessian 或 Google 的 Protocol Buffers 这样的二进制协议。
我们还发现,将消息数量减至最低可以减少延迟,因此请注意以更少、更大的块向 iPhone 发送数据的方法,在手机上使用 HTTP 缓存,使用HTTP 实体标签和 If-Modified 标头等。由于您使用的是 REST,因此您可以很好地利用 HTTP 的所有这些优秀特性。
当然,这很容易成为过早的优化,因此请尽可能以最简单的方式对其进行编码并首先进行测量。
【讨论】:
这实际上取决于您的需求以及您将在服务器和应用程序之间传输什么样的数据。如果您想执行查询以选择一些数据,您应该选择 XML,因为 XQuery 语言支持。据我所知,不支持 JSON。关于 YAML,我无话可说。
【讨论】:
好吧,如果您想使用 XML,请使用 plist,因为它在 iphone 上原生支持。 JSON 不是,但有一些不错的 c 库可用。我的应用程序支持 JSON 和 XML。
与 XML 相同 - 有很多 - 只需四处搜索。
这还取决于您的服务器支持哪些媒体类型 - 顺便说一句,REST 并不是真正的协议。
【讨论】: