摘 要: 文章主要討論手機應用開發(fā)實驗教學的案例設計, 旨在更充分深入地了解iOS開發(fā)和 android 應用開發(fā)的不同之處。重視實驗教學和實踐過程,以學生為主體,培養(yǎng)其主動性、協(xié)作精神和創(chuàng)新能力,實實在在地提高實驗教學水平。本文介紹了Protocol Buffer技術,并比較了Protocol Buffer和JSON,討論了兩種數(shù)據(jù)傳輸格式在網(wǎng)絡數(shù)據(jù)交換中的不同,通過實例說明如何使用Protocol Buffer代替JSON作為iOS應用開發(fā)中數(shù)據(jù)傳輸格式。
關鍵詞: Protocol Buffer JSON iOS
隨著蘋果iOS系統(tǒng)為越來越多人所使用,iOS應用開發(fā)也成為程序員所必須掌握的開發(fā)技術之一。在iOS應用開發(fā)中,JSON作為網(wǎng)絡數(shù)據(jù)傳輸格式發(fā)揮了較大的作用,但JSON也有很大的局限性。本文通過比較Protocol Buffer和JSON,證明使用Protocol Buffer代替JSON作為iOS網(wǎng)絡數(shù)據(jù)傳輸中的數(shù)據(jù)格式的有效性,并以工程應用為背景,進行了設計案例分析。
一、ProtocolBuffer簡介
Protocol Buffer是google 的一種數(shù)據(jù)交換的格式,它獨立于語言,獨立于平臺。Google 提供了三種語言的實現(xiàn):java、c++ 和 python,每一種實現(xiàn)都包含了相應語言的編譯器及庫文件。與XML和JSON不同,它是一種二進制的格式,可以把它用于分布式應用之間的數(shù)據(jù)通信或者異構環(huán)境下的數(shù)據(jù)交換。作為一種效率和兼容性都很優(yōu)秀的二進制數(shù)據(jù)傳輸格式,可以用于諸如網(wǎng)絡傳輸、配置文件、數(shù)據(jù)存儲等諸多領域。
二、JSON
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式。它基于JavaScript的一個子集。JSON建構有兩種結構:
?。ㄒ唬懊Q/值”對的集合,對于不同的語言中,它被理解為對象、記錄、結構、字典、哈希表、有鍵列表或者關聯(lián)數(shù)組。
?。ǘ┲档挠行蛄斜?,可以將其理解為數(shù)組(array)。
下面是一個JSON 格式的數(shù)據(jù)示例:
{persons:[
{ "id":"1", "name": "sam", "email": "sam@123.com"},
{ "id":"2", "name":"mike", " email ":"mike@123.com"}
]};
三、iOS應用開發(fā)
iOS是由蘋果公司開發(fā)的手持設備操作系統(tǒng),使用與iPhone/iPad等蘋果手持設備。
iOS應用(iOS APP)開發(fā)使用Objective-C作為開發(fā)語言,使用xcode作為主要開發(fā)環(huán)境。iOS應用,開發(fā)完成通過審核后在蘋果商店(AppStore)公開發(fā)布。
四、使用Protocol Buffer的優(yōu)勢
Protocol Buffers把對象序列化為二進制格式,比JSON方式占用更少的網(wǎng)絡傳輸字節(jié)數(shù)。
JSON需要服務端和客戶端分別自行實現(xiàn)序列化Serializer和反序列化Parser,以實現(xiàn)所需要傳輸對象的編碼和解析。例如當前iOS客戶端都會有的大量JSON Parser代碼,也會有很多JSON解析開源的工程。而Protocol Buffer,服務端和客戶端則使用共同的Message定義文件(.proto)和Protocol Buffer編譯器,編譯出不同語言適用的源代碼文件,從而自動實現(xiàn)了Serializer及Parser,我們可以把代碼加入工程直接使用。就客戶端來講,相比自行實現(xiàn)解析字符串的JSON Parser,Protocol Buffer提供的針對二進制數(shù)據(jù)的Parser在執(zhí)行效率上要高很多,并且不用我們親自編寫實現(xiàn)代碼。
五、Protocol Buffer使用方法,以C++為例
?。ㄒ唬┚帉?proto文件,作為Message聲明,服務端和客戶端共用。
例如定義一個Person.proto
message Person {
required int32 id = 1;
required string name = 2;
optional string email = 3;
}
?。ǘ┦褂肞rotocol Buffers編譯器Protoc,編譯.proto文件,生成java/c++/python代碼文件。
IOS端可以使用的是C++代碼,以C++為例,命令行輸入:
Protoc –cpp_out=./ Person.proto。
在當前目錄下生成Person.pb.h以及Person.pb.cc。
(三)在工程里加入生成的Person.h和Person.cc,即可使用以下代碼實現(xiàn)讀寫。
定義,使用,以及序列化:
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開發(fā)中的應用
由于iOS開發(fā)主要使用Objective-C作為開發(fā)語言,需要與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;
}
七、結語
隨著計算機技術的發(fā)展,近年來智能手機成為嵌入式系統(tǒng)中非?;钴S的領域,3G更是刺激了移動互聯(lián)網(wǎng)發(fā)展。Android 作為Google開發(fā)的開源手機操作系統(tǒng),具有良好的開放性,且發(fā)展?jié)摿θ找鏀U大。相比較iOS,有其獨有的發(fā)展優(yōu)勢。本文主要討論區(qū)別于Android應用開發(fā)的iOS平臺。每個開發(fā)者,無論是開發(fā)iOS等移動操作系統(tǒng)的應用,標準桌面應用程序或Web應用程序,都都越來越注意到了Protocol Buffer的簡單和便捷,將在各個方面得到更廣泛的應用,為用戶提供更為友好、更為有效的體驗。本文旨在為學生設計一個基于ios的移動應用的開發(fā)教學案例,培養(yǎng)學生更了解和掌握移動應用開發(fā)的技術和能力。
參考文獻:
[1]Danny Goodman.iOS 4 SDK入門:給JavaScript程序員[M].東南大學出版社,2011.05.
[2]胡雯.利用JSON實現(xiàn)Ajax中數(shù)據(jù)傳遞[J].科技信息,2009(15).
[3]姜宇.JSON在電子政務信息系統(tǒng)數(shù)據(jù)交換中的研究與應用[J].科技創(chuàng)新導報,2012(15).
[4]王魁生,王曉波.利用JSON進行網(wǎng)站客戶端與服務器數(shù)據(jù)交互[J].軟件導刊,2010(3).
項目號:201004Q
項目名稱:浙江省實驗教學示范中心