5

我正在使用 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 案例类方法反序列化消息?

4

2 回答 2

6

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...
}
于 2016-03-30T22:20:09.437 回答
1

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

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

于 2016-03-30T20:53:38.930 回答