gpt4 book ai didi

kotlin - 在 Kotlin 中锁定 serialVersionUID

转载 作者:行者123 更新时间:2023-12-01 23:04:43 27 4
gpt4 key购买 nike

我整个上午都在与锁定 serialVersionUID 作斗争。在 Kotlin 类(class)中。我有一个 BaseModelProject 扩展

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; local class incompatible: stream classdesc serialVersionUID = 4156405178259085766, local class serialVersionUID = 2024101567466310467



我试过添加:
private val serialVersionUID: Long = 1 

对所有类无效。

StackOverflow 上的一些示例使用 serialVersionUid这也没有效果(我相信这是intelliJ出于某种原因将最后两个字母小写)
@JvmStatic在这里不起作用,因为它不是 object ,我尝试将其设为非私有(private)但没有成功。

最佳答案

您可以定义serialVersionUID作为伴随对象中的常量:

abstract class BaseModel<T> : Serializable {
companion object {
private const val serialVersionUID: Long = -1
}
}

常量被编译成字段,伴生的字段被存储为包含伴生的类的静态字段。因此你得到你需要的——一个私有(private)静态字段 serialVersionUID在您的可序列化类中。

关于kotlin - 在 Kotlin 中锁定 serialVersionUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39529722/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com