Escribí la clase de datos
data class FileHeader( val relativePath: String, val orderNumber: Long, val bodySize: Int ) : Serializable { @Transient var headerSize: Int = 0 get() = relativePath.length + 8 }Funciona como espero.
Pero, ¿por qué no puedo usar @Transient con el campo val?
el error es:
Esta anotación no se aplica a la propiedad de miembro de destino sin campo de respaldo o delegado
¿Hay alguna razón por la que se implementó de esta manera?
la anotación
La serialización predeterminada funciona en los campos y no se preocupa por los métodos getter. Entonces, si no hay un campo de respaldo, no hay nada que serializar (y nada que marcar como transient en el código de bytes). La anotación sería inútil en este caso, por lo que los diseñadores optaron por convertirla en un error.
Si no ve por qué no hay un campo de respaldo:
Con su var , el setter predeterminado necesita el campo de respaldo; cuando lo cambias a val , no lo es.
Prueba esto
@get:javax.persistence.Transient val headerSize get() { ... }