我正在编写一个与外部服务器通信的简单应用程序。 服务器当前支持yaml,xml和json。
答案 0 :(得分:5)
我参与了一个项目,该项目将运行J2ME的摩托罗拉手机与网络中的语音服务器连接起来。我们发现总带宽值得优化(这是2004年的2.5G网络)。因此,我建议您测量每个序列化格式占用的字节数,并使用较小的字节(将是JSON或YAML)。您甚至可以考虑使用像Hessian或Google的Protocol Buffers这样的二进制协议。
我们还发现,尽量减少消息的数量可以减少延迟,因此请注意以更少,更大的块发送数据到iPhone的方法,在手机上使用HTTP缓存,使用HTTP实体标记和If-Modified标头,依此类推。由于您使用的是REST,因此您可以充分利用HTTP的所有这些优点。
当然,这一切都很容易过早优化,因此请以最简单的方式对其进行编码并首先进行测量。
答案 1 :(得分:3)
我为iPhone OS 3.0创建了一个开源应用程序,展示了如何使用REST& iPhone应用程序中的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上启动测试,然后将结果邮寄给自己进行比较和研究。
希望它有所帮助!
答案 2 :(得分:2)
使用json-framework,使您的类与JSON互操作非常容易。
答案 3 :(得分:1)
好吧,如果你想使用XML,请使用plist,因为它本身支持iphone。 JSON不是,但有一些很好的c库可用。我在我的应用程序中支持JSON和XML。
与XML相同 - 有一堆 - 只是搜索。
它还取决于您的服务器支持的媒体类型 - 顺便说一句,REST实际上并不是一种协议。
答案 4 :(得分:1)
我有一些基准来比较这里提供的不同序列化程序的性能和有效负载大小:
基本上,如果您使用.NET Web服务进行开发,那么除非您使用其他序列化程序,否则将会对有效负载大小与性能进行折衷。
Marc的protobuf-net显示了最小和最快的实现:
虽然是二进制协议,但可能更难调试。
如果您使用MonoTouch(即iPhone的C#/ Mono)进行开发并希望使用基于文本的格式,那么您可能对我的Javascript-like type serializer感兴趣的已针对尺寸和速度进行了优化,它也是与可用的XML和JSON选项相比,显示出适度的增益,即:
这是一个MonoTouch教程,展示了如何从iPhone调用Web服务: http://www.servicestack.net/monotouch/remote-info/
答案 5 :(得分:1)
IF 您可以在iPhone项目中使用 c ++ 库,那么请查看的 YAML-CPP 强>:
http://code.google.com/p/yaml-cpp/
答案 6 :(得分:0)
这实际上取决于您的需求以及您要在服务器和应用程序之间传输的数据类型。如果要执行查询以选择某些数据,则应该选择XML,因为XQuery语言支持。据我所知,不支持JSON。我对YAML无话可说。
答案 7 :(得分:0)
我没有看到任何YAML库(虽然它并不意味着没有)。我知道TouchJSON工作得很好,至少还有一个。
JSON占用的空间比XML或PLIST提供的空间少,但是需要更多的思考才能使结构正确。
pLists的一个不错的方面是你将日期作为对象取回而不进行解析。如果您在JSON中传递日期决定格式并在任何地方使用相同的格式。 NSDateFormatter不是线程安全的,因此如果要使用单个日期格式化程序来节省资源,则必须为每个线程创建一个实例。
答案 8 :(得分:0)
Objective-C支持所有三种格式。只是为他们谷歌。我建议写一个支持这三个的序列化器。只需使用.xml | .json | .yaml结束您的URL资源请求,并让服务器根据该扩展名决定要序列化的内容。然后你实际上不必决定你可以切换到你想要的任何东西。在大多数服务器端实现中,使串行器可插拔非常容易。