網上的序列化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?