2021年5月14日金曜日

inline class および value class で kotlinx.serialization (JSON) が動く組み合わせ

inline class および value class で kotlinx.serialization (JSON) が動く組み合わせを調べてみた


inline class のときのコード
  1. @Serializable  
  2. inline class ItemId(val value: String)  
  3.   
  4. @Serializable  
  5. data class Item(val id: ItemId, val name: String)  
  6.   
  7. fun main() {  
  8.     val item = Item(ItemId("1"), "Android")  
  9.     val json = Json.encodeToString(item)  
  10.     println(json)  
  11.     println(Json.decodeFromString<Item>(json))  
  12. }  
value class のときのコード
  1. @Serializable  
  2. @JvmInline  
  3. value class ItemId(val value: String)  
  4.   
  5. @Serializable  
  6. data class Item(val id: ItemId, val name: String)  
  7.   
  8. fun main() {  
  9.     val item = Item(ItemId("1"), "Android")  
  10.     val json = Json.encodeToString(item)  
  11.     println(json)  
  12.     println(Json.decodeFromString<Item>(json))  
  13. }  

Kotlin: 14.32, kotlinx.serialization: 1.1.0 + inline class

ビルドエラーになる

e: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during file facade code generation

Kotlin: 1.4.32, kotlinx.serialization: 1.2.1 + inline class

ビルドエラーになる

e: org.jetbrains.kotlin.backend.common.BackendException: Backend Internal error: Exception during file facade code generation

Kotlin: 1.4.32, kotlinx.serialization: 1.1.0 + value class

@JvmInline が無いのでビルドエラーになる

Kotlin: 1.4.32, kotlinx.serialization: 1.2.1 + value class

@JvmInline が無いのでビルドエラーになる

Kotlin: 1.5.0, kotlinx.serialization: 1.1.0 + inline class

動く

Kotlin: 1.5.0, kotlinx.serialization: 1.2.1 + inline class

動く

Kotlin: 1.5.0, kotlinx.serialization: 1.1.0 + value class

動く

Kotlin: 1.5.0, kotlinx.serialization: 1.2.1 + inline class

動く


Kotlin を 1.5.0 にすれば kotlinx.serialization を 1.2 にしなくても inline class と value class 両方で動いた。


0 件のコメント:

コメントを投稿