如何 serialize/deserialize 使用 ScalaPB 'oneof' 的 protobuf 消息?

How to serialize/deserialize a protobuf message that uses 'oneof' with ScalaPB?

我正在使用 ScalaPB 编译我的 Scala 案例 classes 用于序列化我的 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 知道我想在 msg 中放置一条 Login 消息?

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

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

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

您将反序列化为 WrapperMessage 并在 message.WhichOneof 上进行模式匹配,其中 returns 为 "login" 或 "register"。然后,您将根据该特定消息调用访问器(即 message.login)。

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