Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用readObject/writeObject反序列化/序列化_Java_Scala_Serialization_Deserialization_Serializable - Fatal编程技术网

Java 使用readObject/writeObject反序列化/序列化

Java 使用readObject/writeObject反序列化/序列化,java,scala,serialization,deserialization,serializable,Java,Scala,Serialization,Deserialization,Serializable,我对这些writeObject/readObject方法有点纠结 假设我有一个 trait AbstractPosition{ def file:Path def start:String def end:String } 与 我现在必须存储这些位置以存档。朴素尝试失败,因为路径对象不可序列化: java.io.NotSerializableException:。源位置 所以我重写: trait AbstractPosition extends Serializable

我对这些writeObject/readObject方法有点纠结

假设我有一个

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

我现在必须存储这些位置以存档。朴素尝试失败,因为路径对象不可序列化:

java.io.NotSerializableException:。源位置

所以我重写:

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类是可序列化的,没有所有这些
writeObject
/
readObject
内容。作为奖励,您将获得由scalac自动生成的
应用
/
取消应用
方法。

上述方法实际上似乎有效


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

,这是假设我永远不希望案例类扩展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))
}