我正在玩序列化,并在从文件读回时遇到输入问题。
我目前的行动计划是使用文件名前缀来建议正确的类型,然后根据该类型进行反序列化。 (这可能是一个“非常糟糕的想法”,所以任何建议都会非常感激!)
基本上,我想将一个对象写入一个文件,然后在某个时候将该文件读回一个正确类型的对象。
以下是我想要使用的内容:
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”的错误。
有人可以提出想法吗?
答案 0 :(得分:4)
作为一种快速解决方法,您可以使用匹配块中已有的类型知识。
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
}
}
答案 1 :(得分:2)
试试这个:
patchClass.cast(inStream.readObject())