De-/Serializing 和 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
成为案例 class:它是一个完美的候选者,因为它是完全不可变的。 Case class 默认情况下是可序列化的,没有所有这些 writeObject
/readObject
东西。作为奖励,您将获得由 scalac 自动生成的 apply
/unapply
方法。
以上似乎有效。
问题似乎是我忽略了一个 val using file
。将该 val 更改为 def 允许我序列化 SourcePosition
我对这些 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
成为案例 class:它是一个完美的候选者,因为它是完全不可变的。 Case class 默认情况下是可序列化的,没有所有这些 writeObject
/readObject
东西。作为奖励,您将获得由 scalac 自动生成的 apply
/unapply
方法。
以上似乎有效。
问题似乎是我忽略了一个 val using file
。将该 val 更改为 def 允许我序列化 SourcePosition