【问题标题】:Use variable value as a Type in Scala在 Scala 中使用变量值作为类型
【发布时间】:2010-07-20 22:57:43
【问题描述】:

我正在玩序列化,并在从文件读回时遇到打字问题。

我目前的行动计划是使用文件名前缀来建议正确的类型,然后基于该类型进行反序列化。 (这很可能是一个“非常糟糕的主意”,因此任何其他建议都将不胜感激!)

本质上,我想将一个对象写入文件,然后稍后再将文件读回正确类型的对象。

以下是我想要使用的东西:

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”的错误。

有人可以提出建议吗?

【问题讨论】:

    标签: serialization scala types


    【解决方案1】:

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

    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
      }
    }
    

    【讨论】:

    • 很好,这行得通!我不确定我是否以最好的方式解决问题,但现在就可以了;谢谢!
    【解决方案2】:

    试试这个:

    patchClass.cast(inStream.readObject())
    

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2021-10-04
      • 2012-09-29
      相关资源
      最近更新 更多