2010-07-20 5 views
1

Je joue avec sérialisation et frapper un problème avec la saisie lors de la lecture de retour dans un fichier.Utiliser la valeur variable comme un type de Scala

Mon plan d'action actuel est d'utiliser un préfixe de nom de fichier pour suggérer le type correct, la base alors la désérialisation sur ce type. (Cela peut très bien être une "très mauvaise idée", donc toute suggestion serait reçue avec le plus de gratitude!)

Essentiellement, je veux écrire un objet dans un fichier, puis, plus tard, lire le fichier dans un objet du type correct.

Voici quelque chose comme ce que je veux utiliser:

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

mais je pense ne suis pas en mesure de types en raison de ne pas être objets. Je reçois une erreur de type « Introuvable: le type patchClass » lorsque vous essayez ce code.

Quelqu'un pourrait-il suggérer des idées?

Répondre

4

Pour contourner ce problème rapide, vous pouvez utiliser les connaissances de type que vous avez déjà directement dans le bloc de 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 
    } 
} 
+0

Nice, qui fonctionne! Je ne suis pas sûr que je suis aborder le problème de la meilleure façon, mais pour l'instant ça va faire; Merci! – owst

2

Essayez ceci:

patchClass.cast(inStream.readObject()) 
Questions connexes