2011-01-23 12 views
11

Ho un problema su Scala. Serializzo un'istanza di classe con il campo @transient lazy val. E poi lo ho deserializzato, il campo è assegnato a null. Mi aspetto la valutazione pigra dopo la deserializzazione. Cosa dovrei fare?serializzazione @lansent lazy val field

Di seguito è riportato un codice di esempio.

object Test { 

    def main(args: Array[String]){ 

    //---------------- 
    // ClassA - with @transient 
    //---------------- 

    val objA1 = ClassA("world"); 

    println(objA1); 
    // This works as expected as follows: 
    // "Good morning." 
    // "Hello, world" 

    saveObject("testA.dat", objA1); 

    val objA2 = loadObject("testA.dat").asInstanceOf[ClassA]; 

    println(objA2); 
    // I expect this will work as follows: 
    // "Good morning." 
    // "Hello, world" 
    // but actually it works as follows: 
    // "null" 



    //---------------- 
    // ClassB - without @transient 
    // this works as expected 
    //---------------- 

    val objB1 = ClassB("world"); 

    println(objB1); 
    // This works as expected as follows: 
    // "Good morning." 
    // "Hello, world" 

    saveObject("testB.dat", objB1); 

    val objB2 = loadObject("testB.dat").asInstanceOf[ClassB]; 

    println(objB2); 
    // This works as expected as follows: 
    // "Hello, world" 

    } 

    case class ClassA(name: String){ 

    @transient private lazy val msg = { 
     println("Good morning."); 
     "Hello, " + name; 
    } 

    override def toString = msg; 

    } 

    case class ClassB(name: String){ 

    private lazy val msg = { 
     println("Good morning."); 
     "Hello, " + name; 
    } 

    override def toString = msg; 

    } 

    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.ObjectInputStream; 
    import java.io.ObjectOutputStream; 

    def saveObject(fname: String, obj: AnyRef){ 
    val fop = new FileOutputStream(fname); 
    val oop = new ObjectOutputStream(fop); 
    try { 
     oop.writeObject(obj); 
    } finally { 
     oop.close(); 
    } 
    } 

    def loadObject(fname: String): AnyRef = { 
    val fip = new FileInputStream(fname); 
    val oip = new ObjectInputStream(fip); 
    try { 
     oip.readObject(); 
    } finally { 
     oip.close(); 
    } 
    } 

} 

risposta

9

Ci sono un paio di biglietti su questo nel Trac di Scala:

vi consiglio di testare contro una build tronco di 2,9, come potrebbe già essere stato risolto

+0

Grazie mille. Proverò 2.9. – hydrocul

+1

Ho provato scala-2.9.0.r23876, e ha funzionato bene. – hydrocul

+0

Qual è una buona soluzione? Scala 2.9 non è ancora stabile. – dsg