我尝试使用Play框架Scala版本来实现WebSocket服务器。现在我可以来回发送和接收消息,它们工作正常。
这是我的控制器动作:
def socket: WebSocket = WebSocket.accept[InEvent, OutEvent] { request =>
ActorFlow.actorRef { out =>
ChatActor.props(out)
}
}
我得到了我的InEvent,OutEvent和JSON格式化程序:
case class OutEvent(content: String)
case class InEvent(content: String)
implicit val inEventFormat = Json.format[InEvent]
implicit val outEventFormat = Json.format[OutEvent]
implicit val messageFlowTransformer =
MessageFlowTransformer.jsonMessageFlowTransformer[InEvent, OutEvent]
潜在的演员:
class ChatActor(out: ActorRef) extends Actor {
def receive: Receive = {
case InEvent(msg) =>
out ! OutEvent(s"received: $msg")
}
}
目前我只有一个案例类用于请求,一个案例类用于响应。那很酷。
但是,如果我想添加更多类型的消息,我无法使其适用于子类型或继承。这里有一些虚假的代码来显示我想要实现但实际上无法正常工作的内容:
消息:
trait Event
case class OutEvent1(content: String)
case class InEvent1(content: String)
case class OutEvent2(body: Int)
case class InEvent2(body: String, content)
演员:
class ChatActor(out: ActorRef) extends Actor {
def receive: Receive = {
case InEvent1(msg) =>
out ! OutEvent1(s"received: $msg")
case InEvent2(body, content) =>
out ! OutEvent2(01234)
}
}
我发现虽然用动态语言(如JavaScript)实现起来非常容易,但基本上我可以将属性作为类型标记,因此我可以假设类型并获取其他属性,实现起来相当困难在静态类型语言中使一切都很容易(并希望不那么冗长)。 所以我的问题是如何在这种情况下使反序列化子类型工作,所以我可以使这些消息类型可扩展?