锁定Kotlin中的serialVersionUID

Jan*_*ert 3 kotlin

我整个上午一直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,我试过让它非私人没有成功.

Ily*_*lya 7

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

abstract class BaseModel<T> : Serializable {
    companion object {
        private const val serialVersionUID: Long = -1
    }
}
Run Code Online (Sandbox Code Playgroud)

常量被编译为字段,伴随的字段存储为包含伴随的类的静态字段.因此,您可以获得所需的内容 - 可serialVersionUID序列化类中的私有静态字段.