Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
protocol_buffers.pdf
Kyohei Ito
November 20, 2016
6
5.8k
protocol_buffers.pdf
Kyohei Ito
November 20, 2016
Tweet
Share
More Decks by Kyohei Ito
See All by Kyohei Ito
flutter_kaigi_2021.pdf
kyoheig3
0
530
flutter_kmm_1.pdf
kyoheig3
1
780
ca.swift_10.pdf
kyoheig3
0
540
iosdc_2018.pdf
kyoheig3
2
2.2k
orecon_vol1.pdf
kyoheig3
4
1.3k
iosdc_2017.pdf
kyoheig3
4
730
ca.swift_2.pdf
kyoheig3
9
1k
ca.swift.pdf
kyoheig3
1
1.8k
abema_devcon.pdf
kyoheig3
8
6.6k
Featured
See All Featured
How to name files
jennybc
47
73k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
270
12k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
GraphQLとの向き合い方2022年版
quramy
20
9.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
32
6.7k
Put a Button on it: Removing Barriers to Going Fast.
kastner
56
2.5k
Making Projects Easy
brettharned
102
4.8k
The Power of CSS Pseudo Elements
geoffreycrofte
52
4.3k
Six Lessons from altMBA
skipperchong
15
2.3k
How STYLIGHT went responsive
nonsquared
89
4.2k
The Pragmatic Product Professional
lauravandoore
21
3.4k
Why You Should Never Use an ORM
jnunemaker
PRO
49
7.9k
Transcript
͜Ε͔Β࢝ΊΔ Protocol Buffers ಋೖ 2016/11/20 iOSΦʔϧελʔζ2
About Me ҏ౻ɹګฏ Github : KyoheiG3 Twitter : @KyoheiG3
protobufʢུʣ
protobufͷ؆୯ͳྺ࢙ • Google͕։ൃͨ͠ɺ௨৴ӬଓԽͰͷར༻Λతͱͨ͠γ ϦΞϥΠζϑΥʔϚοτ • ॳ൛20087݄7Β͍͠ʢWikipediaΑΓʣ • ࠷৽൛3.1.0
ͳͥࠓprotobufͳͷ͔ʁ • swiftͷprotobufͷϥΠϒϥϦͦͦ͜͜લ͔Β͋ͬͨ1 • appleͷgithubʹswift-protobufͷϦϙδτϦ͕ެ։͞Εͨ2 2 swift-protobuf 1 protobuf-swift
"I guess Apple decided that JSON is a relic of
the past along with Objective-C" - @cjwirth
Apple͞ΜͷτϨϯυʹ͔ͬΓ·͠ΐ͏ʂ
֓ཁ
JSONXMLͷ͓͞Β͍ • Key Value • Text • Ϛοϐϯά
protobufͷΈ • .protoఆٛ • γϦΞϥΠζ/σγϦΞϥΠζ • όΠφϦσʔλ௨৴
protobufͷϝϦοτ • σʔλྔ • ߴ • ҆શ • ڞ༗
protobufͷσϝϦοτ • ίϯύΠϧ • ಋೖखॱ • ֬ೝखॱ
.protoͰఆٛͰ͖Δجຊͷܕ3 int32 sint32 sfixed32 uint32 fixed32 int64 sint64 sfixed64 uint64
fixed64 bool float double string bytes 3 apple/swift-protobufͷAPI OverviewΑΓൈਮ
ಋೖ
Կͱ͋ΕprotobufΛೖΕΔ $ brew install protobuf
protobufͷSwiftϓϥάΠϯΛ࡞ checkout͢Δλά࠷৽ͷͷ $ git clone https://github.com/apple/swift-protobuf.git $ cd swift-protobuf $
git checkout tags/0.9.24 $ swift build > .build/debug/protoc-gen-swift
࡞ͨ͠ϓϥάΠϯΛ͑ΔΑ͏ʹ͢Δ ඞཁʹԠͯ͡ҙͷॴʹஔ͍ͯPATHΛ௨͢ $ mkdir ~/.protoc $ cp .build/debug/protoc-gen-swift ~/.protoc/protoc-gen-swift $
echo 'export PATH=$PATH:$HOME/.protoc' >> ~/.bash_profile $ source ~/.bash_profile
.protoͷ࡞
DataModel.proto syntax = "proto3"; message BookInfo { int64 id =
1; string title = 2; string author = 3; } message MyLibrary { int64 id = 1; string name = 2; repeated BookInfo books = 3; map<string,string> keys = 4; } quick-example
syntax syntax = "proto3"; • proto3ͱهड़͠ͳ͍ͱproto2ͱΈͳ͞ΕΔ
message message BookInfo { } • ॴҦΫϥεఆٛ • ͜ͷதʹϑΟʔϧυΛఆ͍ٛͯ͘͠
Field Types int64 id = 1; string title = 2;
string author = 3; • ܕͱม໊Λઃఆ͢Δ
Tags int64 id = 1; string title = 2; string
author = 3; • messageͰҰҙͷΛׂΓͯΔ • ॱংߟྀ͠ͳͯ͘ྑ͍
Field Rules repeated BookInfo books = 3; • repeatedͰྻΛఆٛͰ͖Δ
ͦͷଞ • package • map • enum • etc.. ৄ͘͠Language
GuideΛࢀর͍ͯͩ͘͠͞ɻ
͏ҰDataModel.proto syntax = "proto3"; message BookInfo { int64 id =
1; string title = 2; string author = 3; } message MyLibrary { int64 id = 1; string name = 2; repeated BookInfo books = 3; map<string,string> keys = 4; }
.protoͷίϯύΠϧ
PATHΛ௨͍ͯ͠Δ߹ $ protoc --swift_out=. DataModel.proto
ϓϥάΠϯΛࢦఆ࣮ͯ͠ߦ͢Δ߹ $ protoc --plugin=protoc-gen-swift=.build/debug/ protoc-gen-swift --swift_out=. DataModel.proto
! ࡞͞Εͨ.pb.swiftΛϓϩδΣΫτʹՃ͠·͠ΐ͏
ͪͳΈʹprotobuf-swiftͩͱ $ brew install protobuf-swift $ protoc --swift_out=. DataModel.proto
ྫ͑goͩͱ $ go get github.com/golang/protobuf/protoc-gen-go $ protoc --go_out=. DataModel.proto
͍ํ
ϥΠϒϥϦͷՃ • Package Manager dependencies: [ .Package(url: "https://github.com/apple/swift-protobuf.git", Version(0,9,24)) ]
• CocoaPods pod 'SwiftProtobuf', git: 'https://github.com/apple/swift-protobuf.git', :tag => '0.9.24' ※ϓϥάΠϯΛ࡞ͨ࣌͠ͷtagͱΠϯετʔϧόʔδϣϯΛ߹ Θ͍ͤͯͩ͘͞ɻ
Binary serializable γϦΞϥΠζ let library = MyLibrary() let data =
try library.serializeProtobuf() σγϦΞϥΠζ let library = try MyLibrary(protobuf: data)
JSON serializable γϦΞϥΠζ let library = MyLibrary() let json =
try library.serializeJSON() σγϦΞϥΠζ let json = String(bytes: data, encoding: String.Encoding.utf8)! let library = try MyLibrary(json: json)
JSONͱͷڞଘ
JSON request let url = URL(string: "http://localhost:8080/")! var request =
URLRequest(url: url) let value = "application/json" request.setValue(value, forHTTPHeaderField: "Accept")
protobuf request let url = URL(string: "http://localhost:8080/")! var request =
URLRequest(url: url) let value = "application/protobuf" request.setValue(value, forHTTPHeaderField: "Accept")
response let library = MyLibrary() let accept = request.headers["Accept"] if
accept == "application/protobuf" { response.headers["Content-Type"] = "application/protobuf" response.send(data: try library.serializeProtobuf()) } else { response.headers["Content-Type"] = "application/json; charset=UTF-8" response.send(try library.serializeJSON()) }
Tips
protobufͷϑΟʔϧυͷมߋʹ͍ͭͯ • ϑΟʔϧυͷՃՄೳ • ϑΟʔϧυ໊ͷมߋ͚ͩͳΒಈ͘ • ϑΟʔϧυܕ·ͰมΘΔ߹ΤϥʔͱͳΔ
λά൪߸ʹ͍ͭͯ • λά൪߸ͰϑΟʔϧυΛࣝผ͢ΔͷͰॏෳແ͘ࢦఆ͢Δ͜ͱ • ޙͰมߋ͢ΔͷNG
Int64ͷѻ͍ʹ͍ͭͯ • jsonʹγϦΞϥΠζͨ͠߹ͷৼΔ͍ • ྫ͑goͩͱͰฦΔ͕swiftͩͱจࣈྻͰฦΔ
protobufͷόʔδϣϯʹ͍ͭͯ • ར༻͢ΔprotocϓϥάΠϯ͕αϙʔτ͢Δprotobufͷόʔδ ϣϯͱɺ.proto͔ΒίʔυΛੜ͢Δࡍͷprotobufͷόʔδ ϣϯΛಉ͡ʹ͢Δ͜ͱ ࢀߟʣHomebrewͰچόʔδϣϯͷύοέʔδΛΠϯετʔ ϧ͍ͨ͠
ͲͷϓϥάΠϯΛར༻͢Δ͔ • apple/swift-protobuf struct • alexeyxo/protobuf-swift class
ੜϑΝΠϧͷهड़ྔ apple/swift-protobuf < alexeyxo/protobuf-swift
Swift Protobuf ͷҙ • ίʔυޓੑ͕ແ͘ͳΔΑ͏ͳੵۃతͳվม͕ߦΘΕ͍ͯΔ • ϝδϟʔόʔδϣϯ·ͩ 0
σϞ https://github.com/KyoheiG3/ProtobufExample
Thanks!