网上的序列化object教程都是基于Java写的,没有Scala版本,只能自己动手改造一下= =
1.要序列化类,首先写一个基础类供我们操作:
非常基础,只有姓名和年龄两个变量的基础类
class Student() extends java.io.Serializable{
var name: String = _
var score: Double = _
def setName(nm: String) = {
this.name = nm
}
def setScore(sc: Double) = {
this.score = sc
}
}
2.准备好类,接下来序列化这个类
这里用到java.io的objcet输出流和arraybyte输出流,调用writeBoject方法将指定类转化为Array[Byte]即可,这里输入参数定义的是各个类的父类any,所以输入什么类都ok
//序列化
def serialize(obj: Any): Array[Byte] = {
var objectOut: ObjectOutputStream = null
var byteArrayOut: ByteArrayOutputStream = null
try {
byteArrayOut = new ByteArrayOutputStream()
objectOut = new ObjectOutputStream(byteArrayOut)
objectOut.writeObject(obj)
val byteArray = byteArrayOut.toByteArray
return byteArray
} catch {
case e: IOException =>
e.printStackTrace()
}
null
}
3.得到Array[Byte],再反序列化这个类
输仍然是java.io,只不过输出流改成输入流,最后调用asInstanceOf换成自己的对象就行
//反序列化
def unserizlize(byteArray: Array[Byte]): Student = {
var objectInput: ObjectInputStream = null
var byteArrayInput: ByteArrayInputStream = null
val byteInput = new ByteArrayInputStream(byteArray)
objectInput = new ObjectInputStream(byteInput)
val obj = objectInput.readObject()
obj.asInstanceOf[Student]
}
4.主函数
def main(args: Array[String]): Unit = {
val st = new Student()
st.setName("ddd")
st.setScore(50D)
val serialSt = serialize(st)
val stSerial = unserizlize(serialSt)
println(stSerial.name)
println(stSerial.score)
}
结果符合预期,大功告成
Tip:
至于序列化又反序列化为什么,套用前段看对Boolean排序的源码中看的一句话:Why would you even do this?