2010-07-20 5 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] 
} 

, но я думаю, что я не в состоянии из-за типы не являющихся объектами. При попытке этого кода я получаю сообщение об ошибке «not found: type 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

2

Попробуйте это:

patchClass.cast(inStream.readObject()) 
Смежные вопросы