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}" } } 
  • Kotlin: ¿Cómo sincronizar espera una list de methods idénticos?
  • Kotlin: los cambios realizados en super constructor se sobrescriben
  • Kotlin reference no resuelta linkedListOf
  • Parcelable con object personalizado plotble
  • La API de Autocompletar de Google Places da error API_NOT_CONECTADO en la configuration de Aplicaciones instantáneas
  • Crear class CSS con kotlinx.html DSL
  • ¿Cómo inicializo un campo final en Kotlin?
  • Cómo leer y escribir files txt en android en kotlin
  • datos e incompatibilidad abierta, ¿qué alternativa tengo?
  • Kotlin mutableMap foreach
  • FragmentManager lanza IllegalArgumentException en Kotlin