摘 要: 文章主要討論手機應用開發實驗教學的案例設計, 旨在更充分深入地了解iOS開發和 android 應用開發的不同之處。重視實驗教學和實踐過程,以學生為主體,培養其主動性、協作精神和創新能力,實實在在地提高實驗教學水平。本文介紹了Protocol Buffer技術,并比較了Protocol Buffer和JSON,討論了兩種數據傳輸格式在網絡數據交換中的不同,通過實例說明如何使用Protocol Buffer代替JSON作為iOS應用開發中數據傳輸格式。
關鍵詞: Protocol Buffer JSON iOS
隨著蘋果iOS系統為越來越多人所使用,iOS應用開發也成為程序員所必須掌握的開發技術之一。在iOS應用開發中,JSON作為網絡數據傳輸格式發揮了較大的作用,但JSON也有很大的局限性。本文通過比較Protocol Buffer和JSON,證明使用Protocol Buffer代替JSON作為iOS網絡數據傳輸中的數據格式的有效性,并以工程應用為背景,進行了設計案例分析。
一、ProtocolBuffer簡介
Protocol Buffer是google 的一種數據交換的格式,它獨立于語言,獨立于平臺。Google 提供了三種語言的實現:java、c++ 和 python,每一種實現都包含了相應語言的編譯器及庫文件。與XML和JSON不同,它是一種二進制的格式,可以把它用于分布式應用之間的數據通信或者異構環境下的數據交換。作為一種效率和兼容性都很優秀的二進制數據傳輸格式,可以用于諸如網絡傳輸、配置文件、數據存儲等諸多領域。
二、JSON
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。它基于JavaScript的一個子集。JSON建構有兩種結構:
(一)“名稱/值”對的集合,對于不同的語言中,它被理解為對象、記錄、結構、字典、哈希表、有鍵列表或者關聯數組。
(二)值的有序列表,可以將其理解為數組(array)。
下面是一個JSON 格式的數據示例:
{persons:[
{ "id":"1", "name": "sam", "email": "sam@123.com"},
{ "id":"2", "name":"mike", " email ":"mike@123.com"}
]};
三、iOS應用開發
iOS是由蘋果公司開發的手持設備操作系統,使用與iPhone/iPad等蘋果手持設備。
iOS應用(iOS APP)開發使用Objective-C作為開發語言,使用xcode作為主要開發環境。iOS應用,開發完成通過審核后在蘋果商店(AppStore)公開發布。
四、使用Protocol Buffer的優勢
Protocol Buffers把對象序列化為二進制格式,比JSON方式占用更少的網絡傳輸字節數。
JSON需要服務端和客戶端分別自行實現序列化Serializer和反序列化Parser,以實現所需要傳輸對象的編碼和解析。例如當前iOS客戶端都會有的大量JSON Parser代碼,也會有很多JSON解析開源的工程。而Protocol Buffer,服務端和客戶端則使用共同的Message定義文件(.proto)和Protocol Buffer編譯器,編譯出不同語言適用的源代碼文件,從而自動實現了Serializer及Parser,我們可以把代碼加入工程直接使用。就客戶端來講,相比自行實現解析字符串的JSON Parser,Protocol Buffer提供的針對二進制數據的Parser在執行效率上要高很多,并且不用我們親自編寫實現代碼。
五、Protocol Buffer使用方法,以C++為例
(一)編寫.proto文件,作為Message聲明,服務端和客戶端共用。
例如定義一個Person.proto
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
(二)使用Protocol Buffers編譯器Protoc,編譯.proto文件,生成java/c++/python代碼文件。
IOS端可以使用的是C++代碼,以C++為例,命令行輸入:
Protoc –cpp_out=./ Person.proto。
在當前目錄下生成Person.pb.h以及Person.pb.cc。
(三)在工程里加入生成的Person.h和Person.cc,即可使用以下代碼實現讀寫。
定義,使用,以及序列化:
Person person;
person.set_id(123);
person.set_name("Bob");
person.set_email("Bob@example.com");
fstream out("person.pb", ios::out | ios::binary | ios::trunc);
person.SerializeToOstream(&out);
out.close();
反序列化:
Person person;
fstream in("person.pb", ios::in | ios::binary);
if (!person.ParseFromIstream(∈)) { cerr << "Failed to parse person.pb." << endl; exit(1);}
六、Protocol Buffer在iOS開發中的應用
由于iOS開發主要使用Objective-C作為開發語言,需要與C++代碼做一些橋接工作,處理為HTTP request和response中適用的Objective-C的類NSData。
序列化:
- (NSData *)serializeToNSData:(Person *)person {
std::string ps = person->SerializeAsString();
return [NSData dataWithBytes:ps.c_str() length:ps.size()];
}
反序列化:
- (Person *)parseFromNSData:(NSData *)data {
char raw[[data length]];
Person *p = new Person;
[data getBytes:raw length:[data length]];
p->ParseFromArray(raw, [data length]);
return p;
}
七、結語
隨著計算機技術的發展,近年來智能手機成為嵌入式系統中非常活躍的領域,3G更是刺激了移動互聯網發展。Android 作為Google開發的開源手機操作系統,具有良好的開放性,且發展潛力日益擴大。相比較iOS,有其獨有的發展優勢。本文主要討論區別于Android應用開發的iOS平臺。每個開發者,無論是開發iOS等移動操作系統的應用,標準桌面應用程序或Web應用程序,都都越來越注意到了Protocol Buffer的簡單和便捷,將在各個方面得到更廣泛的應用,為用戶提供更為友好、更為有效的體驗。本文旨在為學生設計一個基于ios的移動應用的開發教學案例,培養學生更了解和掌握移動應用開發的技術和能力。
參考文獻:
[1]Danny Goodman.iOS 4 SDK入門:給JavaScript程序員[M].東南大學出版社,2011.05.
[2]胡雯.利用JSON實現Ajax中數據傳遞[J].科技信息,2009(15).
[3]姜宇.JSON在電子政務信息系統數據交換中的研究與應用[J].科技創新導報,2012(15).
[4]王魁生,王曉波.利用JSON進行網站客戶端與服務器數據交互[J].軟件導刊,2010(3).
項目號:201004Q
項目名稱:浙江省實驗教學示范中心