Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Protobuf in Kotlin

TakuSemba
March 27, 2019

Protobuf in Kotlin

TakuSemba

March 27, 2019
Tweet

More Decks by TakuSemba

Other Decks in Technology

Transcript

  1. View Slide

  2. @takusemba
    https://github.com/TakuSemba

    View Slide

  3. Protocol Buffers

    View Slide

  4. Json Protocol buffers

    View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. Wire
    Clean, lightweight protocol buffers for Android and Java.

    View Slide

  10. syntax = "proto3";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }

    View Slide

  11. View Slide

  12. View Slide

  13. data class Coffee(
    /**
    * ex) espresso
    */
    @field:WireField(tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING")
    val name: String? = null,
    /**
    * ex) 340
    */
    @field:WireField(tag = 2, adapter = "com.squareup.wire.ProtoAdapter#DOUBLE")
    val price: Double? = null,
    /**
    * ex) small / medium / large
    */
    @field:WireField(tag = 3, adapter = "com.takusemba.proto.Size#ADAPTER")
    val size: Size? = null,
    /**
    * ex) true / false
    */
    @field:WireField(tag = 4, adapter = "com.squareup.wire.ProtoAdapter#BOOL")
    val isAvailable: Boolean? = null,
    val unknownFields: ByteString = ByteString.EMPTY
    ) : Message(ADAPTER, unknownFields) {

    }

    View Slide

  14. data class Coffee(
    /**
    * ex) espresso
    */
    @field:WireField(tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING")
    val name: String? = null,
    /**
    * ex) 340
    */
    @field:WireField(tag = 2, adapter = "com.squareup.wire.ProtoAdapter#DOUBLE")
    val price: Double? = null,
    /**
    * ex) small / medium / large
    */
    @field:WireField(tag = 3, adapter = "com.takusemba.proto.Size#ADAPTER")
    val size: Size? = null,
    /**
    * ex) true / false
    */
    @field:WireField(tag = 4, adapter = "com.squareup.wire.ProtoAdapter#BOOL")
    val isAvailable: Boolean? = null,
    val unknownFields: ByteString = ByteString.EMPTY
    ) : Message(ADAPTER, unknownFields) {

    }
    val name: String? = null,
    val price: Double? = null,
    val size: Size? = null,
    val isAvailable: Boolean? = null,

    View Slide

  15. data class Coffee(
    /**
    * ex) espresso
    */
    @field:WireField(tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING")
    val name: String? = null,
    /**
    * ex) 340
    */
    @field:WireField(tag = 2, adapter = "com.squareup.wire.ProtoAdapter#DOUBLE")
    val price: Double? = null,
    /**
    * ex) small / medium / large
    */
    @field:WireField(tag = 3, adapter = "com.takusemba.proto.Size#ADAPTER")
    val size: Size? = null,
    /**
    * ex) true / false
    */
    @field:WireField(tag = 4, adapter = "com.squareup.wire.ProtoAdapter#BOOL")
    val isAvailable: Boolean? = null,
    val unknownFields: ByteString = ByteString.EMPTY
    ) : Message(ADAPTER, unknownFields) {

    }
    data class Coffee(

    View Slide

  16. --java_interop

    View Slide

  17. --java_interop
    val coffee = Coffee(
    name = "espresso",
    price = 310.0,
    size = Size.SMALL,
    isAvailable = true
    )

    View Slide

  18. --java_interop
    val coffee = Coffee(
    name = "espresso",
    price = 310.0,
    size = Size.SMALL,
    isAvailable = true
    )
    val coffee = Coffee.Builder()
    .name("espresso")
    .price(310.0)
    .size(Size.SMALL)
    .isAvailable(true)
    .build()

    View Slide

  19. --java_interop
    val coffee = Coffee(
    name = "espresso",
    price = 310.0,
    size = Size.SMALL,
    isAvailable = true
    )
    val coffee = Coffee.Builder()
    .name("espresso")
    .price(310.0)
    .size(Size.SMALL)
    .isAvailable(true)
    .build()
    val name: String

    View Slide

  20. --java_interop
    val coffee = Coffee(
    name = "espresso",
    price = 310.0,
    size = Size.SMALL,
    isAvailable = true
    )
    val coffee = Coffee.Builder()
    .name("espresso")
    .price(310.0)
    .size(Size.SMALL)
    .isAvailable(true)
    .build()
    val name: String @JvmField val name: String

    View Slide

  21. kotlin nullability

    View Slide

  22. kotlin nullability
    syntax = "proto3";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }

    View Slide

  23. kotlin nullability
    syntax = "proto3";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }
    syntax = "proto3";

    View Slide

  24. kotlin nullability
    syntax = “proto2";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }
    syntax = “proto2";

    View Slide

  25. kotlin nullability
    syntax = “proto2";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }
    message Coffee {
    string name = 1; // espresso
    double price = 2; // 340
    Size size = 3; // small / medium / large
    bool isAvailable = 4; // true / false
    }

    View Slide

  26. kotlin nullability
    syntax = "proto2";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    required string name = 1; // espresso
    required double price = 2; // 340
    required Size size = 3; // small / medium / large
    optional bool isAvailable = 4; // true / false
    }
    message Coffee {
    required string name = 1; // espresso
    required double price = 2; // 340
    required Size size = 3; // small / medium / large
    optional bool isAvailable = 4; // true / false
    }

    View Slide

  27. kotlin nullability
    syntax = "proto2";
    package com.takusemba;
    option java_package = "com.takusemba.proto";
    enum Size {
    SMALL = 0;
    MEDIUM = 1;
    LARGE = 2;
    }
    message Coffee {
    required string name = 1; // espresso
    required double price = 2; // 340
    required Size size = 3; // small / medium / large
    optional bool isAvailable = 4; // true / false
    }

    View Slide

  28. data class Coffee(
    /**
    * ex) espresso
    */
    @field:WireField(tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING")
    val name: String,
    /**
    * ex) 340
    */
    @field:WireField(tag = 2, adapter = "com.squareup.wire.ProtoAdapter#DOUBLE")
    val price: Double,
    /**
    * ex) small / medium / large
    */
    @field:WireField(tag = 3, adapter = "com.takusemba.proto.Size#ADAPTER")
    val size: Size,
    /**
    * ex) true / false
    */
    @field:WireField(tag = 4, adapter = "com.squareup.wire.ProtoAdapter#BOOL")
    val isAvailable: Boolean? = null,
    val unknownFields: ByteString = ByteString.EMPTY
    ) : Message(ADAPTER, unknownFields) {

    }

    View Slide

  29. data class Coffee(
    /**
    * ex) espresso
    */
    @field:WireField(tag = 1, adapter = "com.squareup.wire.ProtoAdapter#STRING")
    val name: String,
    /**
    * ex) 340
    */
    @field:WireField(tag = 2, adapter = "com.squareup.wire.ProtoAdapter#DOUBLE")
    val price: Double,
    /**
    * ex) small / medium / large
    */
    @field:WireField(tag = 3, adapter = "com.takusemba.proto.Size#ADAPTER")
    val size: Size,
    /**
    * ex) true / false
    */
    @field:WireField(tag = 4, adapter = "com.squareup.wire.ProtoAdapter#BOOL")
    val isAvailable: Boolean? = null,
    val unknownFields: ByteString = ByteString.EMPTY
    ) : Message(ADAPTER, unknownFields) {

    }
    val name: String, // required
    val price: Double, // required
    val size: Size, // required
    val isAvailable: Boolean? = null, // optional

    View Slide

  30. https://github.com/takusemba
    https://twitter.com/takusemba

    View Slide