如何 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...
}
我正在使用 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...
}