Bloqueando el serialVersionUID en Kotlin

He estado luchando toda la mañana para bloquear el serialVersionUID en una class de Kotlin. Tengo un BaseModel que se extiende por 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(BuffenetworkingOutputStream(FileOutputStream(fetchFileName())) ) oos.writeObject(fetchData()); oos.close(); } } 

Y la class de proyecto:

 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}" } } 

Cada vez que escribo en el disco y luego cambio cualquier cosa en la class y trato de leerlo nuevamente, obtengo:

java.io.InvalidClassException: com.jvaas.bob.model.Project; class local incompatible: stream classdesc serialVersionUID = 4156405178259085766, class local serialVersionUID = 2024101567466310467

He intentado agregar:

 private val serialVersionUID: Long = 1 

a todas las classs sin ningún efecto.

Algunos ejemplos en StackOverflow estaban usando serialVersionUid que no tuvo ningún efecto tampoco (creo que esto es inteligencia bajando las últimas dos letras por alguna razón)

@JvmStatic no funciona aquí porque no es un object , he intentado hacerlo no privado sin éxito.

Puede definir serialVersionUID como una constante en un object complementario:

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

Las constantes se comstackn en campos y los campos de un compañero se almacenan como campos estáticos de la class que contiene el complemento. Por lo tanto, obtienes lo que necesitas: un campo estático privado serialVersionUID en tu class serializable.

La solución fue en realidad mucho más simple de lo que pensé, use un object complementario. Esto ahora serializa perfectamente y si agrego más campos, aún se serializa en el disco y se deserializa a less que cambie el serialVersionUID

Base:

 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 } ... } 

Proyecto:

 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}" } } 
  • ¿Puedo actualizar un object inmutable profundamente nested sin tomar conciencia de su context?
  • Singleton con parámetro en Kotlin
  • Parámetros de tipo genérico de order superior (¿o recursivo?) En kotlin
  • ¿Cómo puedo inyectar un object en el presentador en la aplicación mosby de Android kotlin MVP con daga?
  • Android: problema del module de actividad de Kotlin con Dagger
  • Extender classs en generics de Kotlin
  • Desactivar cheque para usar el package 'kotlin' en Gradle
  • Deserialization de Jackson: classs de datos de Kotlin: valores pnetworkingeterminados para campos faltantes por asignador
  • Kotlin reflect proguard SmallSortedMapa
  • consultas de múltiples dominios de Android con RXJava
  • Spring Data Elasticsearch con Script Field con Kotlin Data Class da como resultado un problema de serialization de Jackson