Slide 1

Slide 1 text

WIRE & Proto3 @bquenaudon

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Identity if absent

Slide 5

Slide 5 text

syntax = "proto2"; message Message { required string a = 1; optional string b = 2; }

Slide 6

Slide 6 text

syntax = "proto2"; message Message { required string a = 1; optional string b = 2; }

Slide 7

Slide 7 text

syntax = "proto3"; message Message { string a = 1; }

Slide 8

Slide 8 text

syntax = "proto3"; message Message { string a = 1; optional string b = 2; }

Slide 9

Slide 9 text

syntax = "proto3"; message Message { string a = 1; optional string b = 2; }

Slide 10

Slide 10 text

Identity if absent Strings → "" Bytes → empty bytes Bools → false Numerics → 0, 0L, 0f, 0.0 Enums → first defined value (which must be 0) Messages → Null

Slide 11

Slide 11 text

syntax = "proto2"; message MyMessage { required string a = 1; optional string b = 2; } class MyMessage( val a: String, val b: String? = null ) : Message() {} →

Slide 12

Slide 12 text

syntax = "proto3"; message MyMessage { string a = 1; optional string b = 2; } class MyMessage( val a: String = "", val b: String? = null ) : Message() {} →

Slide 13

Slide 13 text

New Types

Slide 14

Slide 14 text

Any → com.squareup.wire.AnyMessage Duration → java.time.Duration Timestamp → java.time.Instant Struct → map Wrappers → Boxed types for primitives (String?) Empty → kotlin.Unit New Types google.protobuf.

Slide 15

Slide 15 text

message Request { // Only set when it is a Bitcoin request. optional BitcoinData bitcoin_data = 1; // Only set when it is a Stock request. optional StockData stock_data = 2; }

Slide 16

Slide 16 text

message Request { // Only set when it is a Bitcoin request. optional BitcoinData bitcoin_data = 1; // Only set when it is a Stock request. optional StockData stock_data = 2; } message Request { // Will be either BitcoinData or StockData. optional google.protobuf.Any request_data = 1; } ↓

Slide 17

Slide 17 text

Any → com.squareup.wire.AnyMessage Duration → java.time.Duration Timestamp → java.time.Instant Struct → map Wrappers → Boxed types for primitives (String?) Empty → kotlin.Unit New Types google.protobuf.

Slide 18

Slide 18 text

Any → com.squareup.wire.AnyMessage Duration → java.time.Duration Timestamp → java.time.Instant Struct → map Wrappers → Boxed types for primitives (String?) Empty → kotlin.Unit New Types google.protobuf.

Slide 19

Slide 19 text

class AnyMessage( val typeUrl: String, val value: ByteString = ByteString.EMPTY ) : Message(ADAPTER, ByteString.EMPTY) { fun unpack(adapter: ProtoAdapter): T fun unpackOrNull(adapter: ProtoAdapter): T? companion object { fun pack(message: Message<*, *>): AnyMessage } }

Slide 20

Slide 20 text

class AnyMessage( val typeUrl: String, val value: ByteString = ByteString.EMPTY ) : Message(ADAPTER, ByteString.EMPTY) { fun unpack(adapter: ProtoAdapter): T fun unpackOrNull(adapter: ProtoAdapter): T? companion object { fun pack(message: Message<*, *>): AnyMessage } }

Slide 21

Slide 21 text

val person: Person = anyMessage.unpack(Person.ADAPTER) val anyMessage: AnyMessage = AnyMessage.ADAPTER.pack(person)

Slide 22

Slide 22 text

JSON

Slide 23

Slide 23 text

JSON?

Slide 24

Slide 24 text

Why JSON?

Slide 25

Slide 25 text

JSON • Proto2 : Wire & Protoc communication is dangerous. • Proto3 : All good.

Slide 26

Slide 26 text

Proto2 㲗 Proto3 Compatibility

Slide 27

Slide 27 text

Proto2 㲗 Proto3 Compatibility • Cannot reference proto2 enums in proto3 message. • Anything else is good.

Slide 28

Slide 28 text

Goodies

Slide 29

Slide 29 text

Goodies package proto.package; import "wire/extensions.proto"; option java_package = "java.package"; option (wire.wire_package) = "wire.package"; message MyMessage {}

Slide 30

Slide 30 text

WIRE & Proto3 FIN

Slide 31

Slide 31 text

References • Protocol Buffers documentations • https://developers.google.com/protocol-buffers/ • Wire documentations • https://square.github.io/wire/