繁体   English   中英

(Scala)识别Kryo序列化对象的类型,该对象是使用UDP通过网络发送的

[英](Scala) Recognize the type a serialized object by Kryo which is sent through network using UDP

目前,我在识别使用UDP通过网络发送的接收序列化对象方面遇到问题。

我有一个称为MsgType的抽象类:

sealed abstract class MsgType
case class Msg(message : String) extends MsgType
case class End() extends MsgType

其中,Msg表示正常消息,而End表示客户端的终止请求。

================================================== =========================

在服务器端,我有一个函数调用isMessage来检测它是正常消息还是终止请求:

def isMessage(message: AnyRef): Boolean = {
    message match{
      case End => false
      case Msg(message) => true
    }
}

================================================== =========================这是使用Kryo接收客户端发送的消息的代码:

val inputString = kyro.readObject(input, classOf[MsgType]) println("incoming Message: " + isMessage(inputString))

但是,当我运行代码时,有一个名为:

Exception in thread "main" com.esotericsoftware.kryo.KryoException: Error 
constructing instance of class: MsgType

我知道是因为MsgType是一个抽象类。

有人可以建议我一个更好的解决方案,以解决识别接收到的序列化对象类型的问题吗?

谢谢,最好的问候,长。

不幸的是,Kryo无法以这种方式工作。 在开始反序列化之前,它应该知道要反序列化的对象的类型。 这意味着您还需要将此信息保存在序列化数据中。 方便地,Kryo提供了writeClassAndObject readClassAndObject这一点的writeClassAndObjectreadClassAndObject

另外,我希望您还会遇到与案例类使用有关的另一个问题。 除非您提供了自定义反序列化器,否则Kryo将失败,因为您的Msg案例类没有默认的构造函数(即,没有参数的构造函数)。 您可以考虑使用twitter chill -Kryo的Scala包装器。 看到在Twitter chill中的 alao 处理案例类(Scala与Kryo的接口)吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM