Serialization 在Scala中将变量值用作类型

Serialization 在Scala中将变量值用作类型,serialization,scala,types,Serialization,Scala,Types,我在玩序列化,在从文件读回时遇到了键入问题 我目前的行动计划是使用文件名前缀来建议正确的类型,然后根据该类型进行反序列化。(这很可能是一个“非常糟糕的主意”,因此我们将非常感谢您提出的任何建议!) 本质上,我想将一个对象写入一个文件,然后,在稍后的某个时刻,将该文件读回正确类型的对象 下面是我想使用的内容: def readPatch(name:String): Patch = { // split name at tilde, prefix gives type val Lis

我在玩序列化,在从文件读回时遇到了键入问题

我目前的行动计划是使用文件名前缀来建议正确的类型,然后根据该类型进行反序列化。(这很可能是一个“非常糟糕的主意”,因此我们将非常感谢您提出的任何建议!)

本质上,我想将一个对象写入一个文件,然后,在稍后的某个时刻,将该文件读回正确类型的对象

下面是我想使用的内容:

def readPatch(name:String): Patch = {
    // split name at tilde, prefix gives type
    val List(typeCode, filename) = List.fromString(name,'~')

    val patchClass = typeCode match {
        case "cfp" => CreateFilePatch.getClass
        case "dfp" => DeleteFilePatch.getClass
        case "cp" => ChangePatch.getClass
    }

    val inStream = new ObjectInputStream(new FileInputStream(filename))

    inStream.readObject().asInstanceOf[patchClass]
}
但我认为,由于类型不是对象,所以我不能这样做。我在尝试此代码时遇到一个错误“未找到:键入patchClass”

有人能提出建议吗?

试试这个:

patchClass.cast(inStream.readObject())
试试这个:

patchClass.cast(inStream.readObject())

作为一种快速解决方法,您可以直接使用match块中已有的类型知识

def readPatch(name:String): Option[Patch] = {
  val List(typeCode, filename) = List.fromString(name,'~')
  val inStream = new ObjectInputStream(new FileInputStream(filename))
  val obj      = inStream.readObject()

  typeCode match {
    case "cfp" => Some(obj.asInstanceOf[CreateFilePatch])
    case "dfp" => Some(obj.asInstanceOf[DeleteFilePatch])
    case "cp"  => Some(obj.asInstanceOf[ChangePatch])
    case _     => None
  }
}

作为一种快速解决方法,您可以直接使用match块中已有的类型知识

def readPatch(name:String): Option[Patch] = {
  val List(typeCode, filename) = List.fromString(name,'~')
  val inStream = new ObjectInputStream(new FileInputStream(filename))
  val obj      = inStream.readObject()

  typeCode match {
    case "cfp" => Some(obj.asInstanceOf[CreateFilePatch])
    case "dfp" => Some(obj.asInstanceOf[DeleteFilePatch])
    case "cp"  => Some(obj.asInstanceOf[ChangePatch])
    case _     => None
  }
}

很好,很有效!我不确定我是不是用最好的方法来解决这个问题,但现在这样就可以了;谢谢很好,很有效!我不确定我是不是用最好的方法来解决这个问题,但现在这样就可以了;谢谢