Could you use the Java implementation of protocol buffers from Kotlin?
I might define a different class for a validated object, so version skew only needs to be dealt with at the system edge.
Maybe you don’t actually have that problem because you can make a closed-world assumption? For example, you control all writers and aren’t saving any old-format data, like in a database that has a schema. In that case you can make fields required.