scala实现对象序列化反序列化比较简单,将需要操作的类继承或混入 Serializable 类之后再使用java的输入输出流函数即可完成,实际上 Serializable 类也只是简单继承了 java 的 Serializable 接口
trait Serializable extends Any with java.io.Serializable
先看一个例子,代码在Scala2.12.10下编译通过
package com.datacrafts.digitalevers.test
import java.io.{FileInputStream, FileOutputStream, ObjectInputStream, ObjectOutputStream}
@SerialVersionUID(1L)
class Person(private val name:String,private val age:Int) extends Serializable {
override def toString: String = {
name+"-"+age
}
def getName1: String = {
name
}
}
object test{
def main(args: Array[String]): Unit = {
val p = new Person("zhangsan",12)
val out = new ObjectOutputStream(new FileOutputStream("person.obj"))
out.writeObject(p)
out.close()
val in = new ObjectInputStream(new FileInputStream("person.obj"))
val person = in.readObject()
println(person)
println(person.asInstanceOf[Person].getName1)
in.close()
}
}
输出
zhangsan-12
zhangsan
需要注意的点
1.@SerialVersionUID(1L)是固定语句,不能更改,否则编译报错
2.Person类需要继承 Serializable, 如果Person有父类,则使用with混入Serializable
3.需要实现重载 toString 方法,可以直接返回一个空字符串 “”
4.反序列化之后打印输出对象会直接调用重载后的 toString 方法进行输出
5.如果要执行对象的方法,使用asInstanceOf先将类型转为原类型Person,再调用对象方法
所以举一反三,可以看到 Scala SDK底层的很多数据结构都有混入Serializable,说明这些数据结构都是可以序列化反序列化的,以ArrayStack(基于Array的栈结构)为例
@SerialVersionUID(8565219180626620510L)
class ArrayStack[T] private(private var table : Array[AnyRef],
private var index : Int)
extends AbstractSeq[T]
with IndexedSeq[T]
with IndexedSeqLike[T, ArrayStack[T]]
with GenericTraversableTemplate[T, ArrayStack]
with IndexedSeqOptimized[T, ArrayStack[T]]
with Cloneable[ArrayStack[T]]
with Builder[T, ArrayStack[T]]
with Serializable
可以在类定义的继承关系最后看到有混入Serializable,并且在定义开头看到@SerialVersionUID 这个ID值是否为编译器默认固定的值
下面给出一个序列化反序列化 ArrayStack 的实际例程
import scala.collection.mutable
var as = new mutable.ArrayStack[Int]
as.push(1)
as.push(12)
val out = new ObjectOutputStream(new FileOutputStream("stack.obj"))
out.writeObject(as)
out.close()
val in = new ObjectInputStream(new FileInputStream("stack.obj"))
val stack = in.readObject()
println(stack)
in.close()
打印输出 //ArrayStack(12, 1)
Pages: 1 2