kotlinでシリアライズするクラスにはデフォルト値を指定してはならぬ
kotlinでシリアライズするクラスにデフォルト値をつけると、頭のいいコンパイラが余計なことをして設定値を書き出さないことがある。
次のコードを実行すると、a,bは意図したとおりになるが、それ以降は値が書き出されない。
@Serializable data class HasDefault( @SerialName("points") val points:Int=10, @SerialName("cycle") val cycle:Int=10 ) @Serializable data class Normal( @SerialName("points") val points:Int, @SerialName("cycle") val cycle:Int ) class Test { @Test fun test() { val a=Normal(1,2) println(Json.encodeToString(a)) val b=HasDefault(1,2) println(Json.encodeToString(b)) val c=HasDefault(10,2) println(Json.encodeToString(c)) val d=HasDefault(10,10) println(Json.encodeToString(d)) val e=HasDefault() println(Json.encodeToString(e)) } }
出力
{"points":1,"cycle":2} {"points":1,"cycle":2} {"cycle":2} {} {}
コンストラクタのデフォルト値を軽い気持ちで書き換えたりすると、忘れたころに災いが起こるであろう。