ネコと和解せよ

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

コンストラクタのデフォルト値を軽い気持ちで書き換えたりすると、忘れたころに災いが起こるであろう。