2010-07-20 69 views
1

我正在玩序列化,并在从文件中读回时遇到打字问题。使用变量值作为Scala中的一个类型

我目前的行动计划是使用文件名前缀来建议正确的类型,然后将反序列化基于该类型。 (这可能是一个“非常糟糕的想法”,所以任何建议,否则将非常感激地收到!)

本质上,我想写一个对象到一个文件,然后,在稍后的某个时候,读取文件回进入正确类型的对象。

下面是什么像什么,我想用:

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

任何人都可以提出想法吗?

回答

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

不错,有效! 我不确定我是否以最好的方式接近这个问题,但现在这样做;谢谢! – owst 2010-07-20 23:45:36

2

试试这个:

patchClass.cast(inStream.readObject()) 
相关问题