使用readObject / writeObject进行序列化

时间:2015-06-04 09:26:00

标签: java scala serialization deserialization serializable

我对这些writeObject / readObject方法有点困难。

假设我有一个

trait AbstractPosition{
    def file:Path
    def start:String
    def end:String
}

class SourcePosition(val: Path, val start:String, val end:String)
    extends AbstractPosition
object SourcePosition {
  def apply(file: Path, start: String, end: String) =
    new SourcePosition(file, start, Some(end))

  def unapply(sp: SourcePosition) = Some((sp.file, sp.start, sp.end))
}

而且我现在必须将这些职位存储起来。天真的尝试失败,因为Path对象不可序列化:

  

java.io.NotSerializableException:...。SourcePosition

所以我改写了:

trait AbstractPosition extends Serializable{
    def file:Path
    def start:String
    def end:String
}

class SourcePosition(@transient var fileArg: Path, val start:String, val end:String)
    extends AbstractPosition{

  private var fileString :String = null
  override def file: Path = this.fileArg

  @throws(classOf[IOException])
  private def writeObject(out: ObjectOutputStream): Unit = {
    fileString = file.toString
    out.defaultWriteObject()
  }

  @throws(classOf[IOException])
  private def readObject(in: ObjectInputStream): Unit = {
    in.defaultReadObject()
    fileArg = Paths.get(fileString)
  }
object SourcePosition {
  def apply(file: Path, start: String, end: String) =
    new SourcePosition(file, start, Some(end))

  def unapply(sp: SourcePosition) = Some((sp.file, sp.start, sp.end))
}

但无济于事:

  

java.io.NotSerializableException:sun.nio.fs.WindowsPath $ WindowsPathWithAttributes

我做错了什么?

我怎样才能实现我的目标?

2 个答案:

答案 0 :(得分:0)

让你的SourcePosition成为一个案例类:它是一个完美的候选人,因为它是完全不可变的。案例类在默认情况下是可序列化的,没有所有这些writeObject / readObject内容。作为奖励,您将获得由scalac自动生成的apply / unapply方法。

答案 1 :(得分:0)

以上实际上似乎有效。

问题似乎是我忽略了使用 file的val 。将该val更改为def允许我序列化SourcePosition