锁定Kotlin中的serialVersionUID

时间:2016-09-16 10:52:39

标签: kotlin

我整个上午一直在与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,我试图将其设为非私人但没有成功。

3 个答案:

答案 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