繁体   English   中英

使用readObject / writeObject反序列化

[英]De-/Serializing with readObject/writeObject

我在这些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

我究竟做错了什么?

我该如何实现自己的目标?

使您的SourcePosition成为case类:因为它是完全不可变的,因此是理想的选择。 Case类默认情况下可序列化,而没有所有writeObject / readObject东西。 作为奖励,你会得到apply / unapply由scalac自动生成的方法。

上面的方法似乎确实有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM