一逢唤、簡(jiǎn)介
1.什么是ProtoBuf鳖藕?
Protobuf是google推出的數(shù)據(jù)交換格式只锭,相比xml、json主要優(yōu)勢(shì)在傳輸數(shù)據(jù)量更小、解析更快召边。它自帶了一個(gè)編譯器隧熙,可以編譯成JAVA、python贞盯、C++代碼,而Swift語言也由第三方提供支持了闷愤。
2.protobuf-swift和swift-protobuf
- protobuf-swift
一個(gè)大牛封裝的swift語言版本的Protobuf讥脐。地址:https://github.com/alexeyxo/protobuf-swift - swift-protobuf
蘋果封裝的(時(shí)間比上面的晚)。地址:https://github.com/apple/swift-protobuf
二旬渠、使用流程
1. 配置環(huán)境:
要想使用Protobuf需要先配置protobuf編譯器本地環(huán)境(個(gè)人感覺protobuf-swift更簡(jiǎn)單些)告丢。
- 配置protobuf-swift(可參考上面官方地址)岖免。
他人簡(jiǎn)書文章參考:http://www.reibang.com/p/e62e941ab67e
// 終端實(shí)測(cè)演示
brew install automake
brew install libtool
brew install protobuf
git clone https://github.com/alexeyxo/protobuf-swift.git
cd protobuf-swift
./scripts/build.sh
- 配置swift-protobuf(可參考上面官方地址)
他人簡(jiǎn)書文章參考:http://www.reibang.com/p/89efeecd5b43
2.編輯proto文件:
- 新建一個(gè)空文件觅捆,以proto為擴(kuò)展名麻敌。
- 編輯該文件添加需要的數(shù)據(jù)字段。例如:
// 使用的版本號(hào)(常用proto2/proto3)
syntax = "proto2";
// 定義數(shù)據(jù)模型(message是固定關(guān)鍵字赢赊,Person是自定義類名)
message UserInfo {
// 定義姓名字段(必要)
required string name = 1;
// 定義年齡字段(可選)
optional int64 age = 2;
}
// 標(biāo)簽數(shù)字1和2則表示不同的字段在序列化后的二進(jìn)制數(shù)據(jù)中的布局位置, 同一message中不能重復(fù)
// Protobuf允許數(shù)據(jù)類型嵌套使用(是不是很強(qiáng)大释移?)玩讳。
3.編譯proto文件
在剛才編輯proto文件的目錄下使用終端執(zhí)行
protoc person.proto --swift_out="./"
即可在當(dāng)前目錄下生成person.proto.swift(自動(dòng)小寫)文件。
4.導(dǎo)入項(xiàng)目
- 導(dǎo)入上面生成的person.proto.swift到項(xiàng)目(拖入或菜單添加文件)同诫。
- 導(dǎo)入ProtocolBuffers.xcodeproj(該文件就是配置環(huán)境時(shí)克隆到本地的)到項(xiàng)目中误窖。
注:ProtocolBuffers可以使用cocoaPods方式導(dǎo)入也可以手動(dòng)拖入(推薦手動(dòng)拖入)霹俺。 - 點(diǎn)擊Xcode上Set the active scheme選擇ProtocolBuffers要編譯的平臺(tái)(支持iOS和MacOS)丙唧,最后command+b編譯成功即可。
5.使用
如同使用普通的數(shù)據(jù)模型類一樣簡(jiǎn)單艇棕,都是對(duì)象操作沼琉。
// 創(chuàng)建數(shù)據(jù)模型對(duì)象(UserInfo即是自定義的數(shù)據(jù)模型類)
let user = UserInfo.Builder()
user.name = "我是\(arc4random_uniform(100))"
// 序列化
let data = (try! user.build()).data()
// 反序列化
let user2 = try! UserInfo.parseFrom(data: data)
print(user2.name)
三桩匪、其他補(bǔ)充
OC Protobuf
http://www.reibang.com/p/6009e96866e5Protobuf 的 proto3 與 proto2 的區(qū)別
https://solicomo.com/network-dev/protobuf-proto3-vs-proto2.html