我整个上午一直serialVersionUID在和Kotlin班级进行斗争.我有一个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();
}
}
Run Code Online (Sandbox Code Playgroud)
而项目类:
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}"
}
}
Run Code Online (Sandbox Code Playgroud)
每次我写入磁盘然后更改类中的任何内容并尝试再次阅读它,我会得到:
java.io.InvalidClassException:com.jvaas.bob.model.Project; 本地类不兼容:stream classdesc serialVersionUID = 4156405178259085766,local class serialVersionUID = 2024101567466310467
我试过添加:
private val serialVersionUID: Long = 1
Run Code Online (Sandbox Code Playgroud)
所有课程都没有效果.
StackOverflow上的一些例子正在使用serialVersionUid哪个也没有效果(我相信这是因为某种原因而使用最后两个字母来降低智能)
@JvmStatic不起作用,因为它不是一个object,我试过让它非私人没有成功.
您可以serialVersionUID在伴随对象中定义为常量:
abstract class BaseModel<T> : Serializable {
companion object {
private const val serialVersionUID: Long = -1
}
}
Run Code Online (Sandbox Code Playgroud)
常量被编译为字段,伴随的字段存储为包含伴随的类的静态字段.因此,您可以获得所需的内容 - 可serialVersionUID序列化类中的私有静态字段.
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |