2016-09-14 14 views
0

私はScalaのシリアライゼーションの基礎を理解しようとしています。私は最後の行に次のような出力を得るの下に、私は最初の例を実行すると:私は物事を例を変更し、代わりにcase classesを使用する場合はres1: A.Mao = [email protected]Scalaのシリアライゼーション

@SerialVersionUID(1L) 
class Poo(val aa:Int) extends Serializable { 
    override def toString() = "Hola" 
} 
@SerialVersionUID(1L) 
class Mao(val hi: Poo) extends Serializable 

def serialize() = { 
    val test = new Mao(new Poo(1)) 
    try{ 
     val fout = new FileOutputStream("c:\\misc\\address.ser"); 
     val oos = new ObjectOutputStream(fout); 
     oos.writeObject(test); 
     oos.close(); 
     System.out.println("Done"); 
    }catch { 
    case ex => ex.printStackTrace(); 
    } 
}             
serialize()          

def ReadObjectFromFile[A](filename: String)(implicit m:scala.reflect.Manifest[A]): A = { 
    val input = new ObjectInputStream(new FileInputStream(filename)) 
    val obj = input.readObject() 
    obj match { 
    case x if m.erasure.isInstance(x) => x.asInstanceOf[A] 
    case _ => sys.error("Type not what was expected when reading from file") 
    } 
}             


ReadObjectFromFile[Mao]("c:\\misc\\address.ser") 

を期待通りに出力で動作します

res1: A.Mao = Mao(Hola) 

case class Poo(val aa:Int) { 
    override def toString() = "Hola" 
} 

case class Mao(val hi: Poo) 

def serialize() = { 
    val test = new Mao(new Poo(1)) 
    try{ 
     val fout = new FileOutputStream("c:\\misc\\address.ser"); 
     val oos = new ObjectOutputStream(fout); 
     oos.writeObject(test); 
     oos.close(); 
     System.out.println("Done"); 
    }catch { 
    case ex => ex.printStackTrace(); 
    } 
}             

def ReadObjectFromFile[A](filename: String)(implicit m:scala.reflect.Manifest[A]): A = { 
    val input = new ObjectInputStream(new FileInputStream(filename)) 
    val obj = input.readObject() 
    obj match { 
    case x if m.erasure.isInstance(x) => x.asInstanceOf[A] 
    case _ => sys.error("Type not what was expected when reading from file") 
    } 
}             

ReadObjectFromFile[Mao]("c:\\misc\\address.ser") 

だから私の クラスに同じクラスの出力を与えるにはどうすればよいですか?

なぜケースクラスはシリアル化に関する明示的な情報を追加しないで動作しますか?

答えて

2

これは(正しい思われる)デ/シリアル化とは何の関係もありません - それは結果がに表示されているだけの方法です:

ScalaのREPL(とワークシート)は、それを表示するには、値のtoStringメソッドを使用します。ケースクラスはデフォルトのtoString()メソッドをオーバーライドします。したがって、出力は(期待通りに)うまく表示されます。非ケースクラスの場合、Object.toString()という致命的実装が呼び出され、表示されるクラス名とアドレスが返されます。

あなたは、あまりにも非ケースクラスのtoStringを実装することができ、同じ結果を得るために:

class Mao(val hi: Poo) extends Serializable { 
    override def toString = s"Mao($hi)" 
} 

// program prints: 
// Done 
// Mao(Hola) 
関連する問題