2010-07-20 32 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()) 
相關問題