Scala中的序列化

Scala中的序列化,scala,serialization,Scala,Serialization,我试图理解Scala中序列化的基础知识。当我运行下面的第一个示例时,我在最后一行得到以下输出:res1:A.Mao=A$$anonfun$main$1$Mao$1@78e67e0a @SerialVersionUID(1L) class Poo(val aa:Int) extends Serializable { override def toString() = "Hola" } @SerialVersionUID(1L) class Mao(val hi: Poo) extends

我试图理解Scala中序列化的基础知识。当我运行下面的第一个示例时,我在最后一行得到以下输出:
res1:A.Mao=A$$anonfun$main$1$Mao$1@78e67e0a

@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")
如果我更改示例并使用
case类
,则输出结果会与预期一样正常

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类相同的输出


为什么case类在不添加任何关于序列化的明确信息的情况下工作?

这与反序列化无关(这似乎是正确的)-这只是结果的显示方式:

Scala REPL(和工作表)使用值的
toString
方法来显示它。Case类覆盖默认的
toString()
方法,因此输出显示得很好(如预期的那样)。对于非case类,调用
Object.toString()
的default实现,并生成您看到的类名和地址

您也可以为非case类实现
toString
,以获得相同的结果:

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

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

这与反序列化无关(这似乎是正确的)-这只是结果的显示方式:

Scala REPL(和工作表)使用值的
toString
方法来显示它。Case类覆盖默认的
toString()
方法,因此输出显示得很好(如预期的那样)。对于非case类,调用
Object.toString()
的default实现,并生成您看到的类名和地址

您也可以为非case类实现
toString
,以获得相同的结果:

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

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