2021年3月23日火曜日

Kotlin Serialization は sealed class も対応していて便利

Kotlin Serialization

  1. plugins {  
  2.     ...  
  3.     id "org.jetbrains.kotlin.plugin.serialization" version "1.4.31"  
  4. }  
  5.   
  6. dependencies {  
  7.     ...  
  8.     implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.1.0"  
  9. }  
  1. @Serializable  
  2. data class Dog(val name: String, val age: Int, val sex: Sex, val kind: Kind)  
  3.   
  4. enum class Sex {  
  5.     MALE,  
  6.     FEMALE  
  7. }  
  8.   
  9. @Serializable  
  10. sealed class Kind {  
  11.   
  12.     @Serializable  
  13.     object Hybrid : Kind()  
  14.   
  15.     @Serializable  
  16.     data class PureBlood(val name: String) : Kind()  
  17. }  
  1. class DogTest {  
  2.   
  3.     @Test  
  4.     fun list() {  
  5.         val dogs = listOf(  
  6.             Dog("White"10, Sex.MALE, Kind.Hybrid),  
  7.             Dog("Black"20, Sex.FEMALE, Kind.PureBlood("Husky"))  
  8.         )  
  9.   
  10.         val json = Json.encodeToString(dogs)  
  11.         println(json)  
  12.         // [{"name":"White","age":10,"sex":"MALE","kind":{"type":"net.yanzm.serialize.Kind.Hybrid"}},{"name":"Black","age":20,"sex":"FEMALE","kind":{"type":"net.yanzm.serialize.Kind.PureBlood","name":"Husky"}}]  
  13.   
  14.   
  15.         val decoded = Json.decodeFromString<List<Dog>>(json)  
  16.   
  17.         assertThat(decoded).isEqualTo(dogs)  
  18.     }  
  19. }  

0 件のコメント:

コメントを投稿