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?

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