Scala中的序列化
我试图理解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
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)