Scala 序列化 反序列化 Object

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章