【问题标题】:How to serialize/deserialize a protobuf message that uses 'oneof' with ScalaPB?如何序列化/反序列化使用 ScalaPB 的“oneof”的 protobuf 消息?
【发布时间】:2016-07-19 01:35:34
【问题描述】:

我正在使用 ScalaPB 编译我的 Scala 案例类以序列化我的 protobuf 消息。

我有一个 .proto 文件,其中包含以下消息:

message WrapperMessage {
    oneof msg {
        Login login = 1;
        Register register = 2;
    }
}

message Login {
    required string email = 1;
    required string password = 2;
}

message Register {
    required string email = 1;
    required string password = 2;
    optional string firstName = 3;
    optional string lastName = 4;
}

知道我想在msg 中添加Login 消息,如何创建我的WrapperMessage

  val login = Login(email = "test@example.com", password = "testpass")
  val wrapperMessage = WrapperMessage(???)
  val wrapperMessageBytes = wrapperMessage.toByteArray

现在假设我通过网络收到了WrapperMessage;如何使用 ScalaPB 案例类方法反序列化消息?

【问题讨论】:

    标签: scala protocol-buffers scalapb


    【解决方案1】:

    您应该能够使用空构造函数初始化 WrapperMessage 并调用 .set_login(login)

    您将反序列化为WrapperMessage 并在message.WhichOneof 上进行模式匹配,返回“登录”或“注册”。然后,您将调用该特定消息的访问器(即message.login)。

    【讨论】:

    • 我能够使用您的建议成功初始化WrapperMessage。在 Scala 中,我使用了WrapperMessage().setLogin(login)。我相信WhichOneof 仅在 Python API 中可用。我只能使用使用 ScalaPB 的 Java API 中的方法。这里有优雅的解决方案吗?
    • 哦,Java API 有getOneofNameCase,它返回一个枚举来指示设置了哪个字段。枚举应该在你的 protobuf scala 定义中定义,假设 ScalaPB 支持它。
    • 我确信有一个像这样工作的解决方案,但发现我的答案只是看着 ScalaPB 的documentation...
    【解决方案2】:

    ScalaPB 的文档清楚地为我提出的问题提供了示例。在这个答案中,我针对我的问题定制了 ScalaPB 上提供的示例。

    使用oneof初始化消息:

    val login = Login(email = "test@example.com", password = "testpass")
    val wrapperMessage = WrapperMessage().withLogin(login)
    

    匹配消息的oneof 字段:

    wrapperMessage.msg match {
      case Msg.Login(l) =>  // handle l
      case Msg.Register(r) =>  // handle r
      case Msg.Empty =>  // handle exceptional case...
    }
    

    【讨论】:

    • 我以前使用过 ScalaPB,但没有使用 oneof 功能。很高兴看到他们尽可能将 Java API 转换为更惯用的 Scala 模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多