我整个上午一直在与Kotlin班的serialVersionUID
作战。我的BaseModel
扩展了Project
abstract class BaseModel<T>(
var id: Int? = null,
private val fileName: String,
private val data: MutableList<T>,
private val indices: MutableMap<Int, T>
) : Serializable {
...
protected fun writeToDisk() {
val oos = ObjectOutputStream(BufferedOutputStream(FileOutputStream(fetchFileName())) )
oos.writeObject(fetchData());
oos.close();
}
}
项目类:
class Project(
var name: String = "",
var repo: String = ""
) : BaseModel<Project>(
data = Data.projects,
indices = Data.projectsIndex,
fileName = "data/projects.dat"
), Serializable {
...
override fun toString(): String {
return "Project: id=${id}, name=${name}, repo=${repo}"
}
}
每当我写入磁盘然后更改课程中的任何内容并尝试再次阅读时,我会得到:
java.io.InvalidClassException:com.jvaas.bob.model.Project;本地 class不兼容:stream classdesc serialVersionUID = 4156405178259085766,本地类serialVersionUID = 2024101567466310467
我尝试添加:
private val serialVersionUID: Long = 1
所有课程都没有效果。
StackOverflow上的一些例子使用的serialVersionUid
也没有任何影响(我相信这是因为某种原因而使用最后两个字母来降低智能)
@JvmStatic
在这里工作不起作用,因为它不是object
,我试图将其设为非私人但没有成功。
答案 0 :(得分:6)
您可以将serialVersionUID
定义为随播对象中的常量:
abstract class BaseModel<T> : Serializable {
companion object {
private const val serialVersionUID: Long = -1
}
}
将常量编译为字段,并将伴随的字段存储为包含随播广告的类的静态字段。因此,您可以获得所需内容 - 可序列化类中的私有静态字段serialVersionUID
。
答案 1 :(得分:2)
解决方案实际上比我想象的要简单得多,使用伴侣对象。这现在完美地序列化,如果我添加更多字段,它仍然序列化到磁盘并反序列化,除非我更改serialVersionUID
基地:
abstract class BaseModel<T>(
var id: Int? = null,
private val fileName: String,
private val data: MutableList<T>,
private val indices: MutableMap<Int, T>
) : Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 1
}
...
}
项目:
class Project(
var name: String = "",
var repo: String = ""
) : BaseModel<Project>(
data = Data.projects,
indices = Data.projectsIndex,
fileName = "data/projects.dat"
), Serializable {
companion object {
@JvmStatic private val serialVersionUID: Long = 1
}
override fun toString(): String {
return "Project: id=${id}, name=${name}, repo=${repo}"
}
}
答案 2 :(得分:0)
安装此插件:GenerateSerialVersionUID,使用插件自动生成默认的串行版本uid,用法:Click here。