Java 使用readObject/writeObject反序列化/序列化
我对这些writeObject/readObject方法有点纠结 假设我有一个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
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))
}