如何序列化/反序列化使用' oneof'的protobuf消息使用ScalaPB?

时间:2016-03-30 20:33:35

标签: scala protocol-buffers scalapb

我使用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;
}

如何创建WrapperMessage知道我想在Login内添加msg条消息?

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

现在我们说我收到了WrapperMessage电话;如何使用ScalaPB案例类方法反序列化消息?

2 个答案:

答案 0 :(得分:5)

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...
}

答案 1 :(得分:0)

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

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