2016-09-14 2 views
0

스칼라에서 직렬화의 기본 사항을 이해하려고합니다. 내가 마지막 줄에 다음과 같은 출력을 얻을 아래 내가 첫 번째 예제를 실행하면 : res1: A.Mao = [email protected]스칼라에서 직렬화

@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") 

그래서 예상대로 작동하는 것을 case classes를 사용하는 경우 내 질문은 다음과 같습니다. 클래스가 동일한 결과물을 사례 클래스로 제공하려면 무엇을해야합니까?

왜 직렬화에 대한 명시적인 정보를 추가하지 않고도 사례 클래스가 작동합니까?

답변

2

이 (올바른 것) 드/직렬화와 아무 상관이있다 - 그것은 결과가 을 표시입니다 단지 방법 :

스칼라 REPL (워크 시트)를 표시 할 값의 toString 방법을 사용합니다. 사례 클래스는 기본 toString() 메서드를 무시하므로 출력이 예상대로 잘 표시됩니다. 비 케이스 클래스의 경우 Object.toString()의 defeault 구현이 호출되며 사용자가 보는 클래스 이름과 주소가됩니다.

당신은 너무 비의 경우 클래스 toString을 구현할 수있는 동일한 결과를 얻을 :

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

// program prints: 
// Done 
// Mao(Hola)