1
+ package com.baeldung.serializeAndDeserializeSealedClass
2
+
3
+ import com.squareup.moshi.Moshi
4
+ import com.squareup.moshi.adapters.PolymorphicJsonAdapterFactory
5
+ import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
6
+ import kotlinx.serialization.SerialName
7
+ import kotlinx.serialization.Serializable
8
+ import kotlinx.serialization.decodeFromString
9
+ import kotlinx.serialization.encodeToString
10
+ import kotlinx.serialization.json.Json
11
+ import kotlinx.serialization.modules.SerializersModule
12
+ import kotlinx.serialization.modules.polymorphic
13
+ import org.junit.jupiter.api.Assertions.assertEquals
14
+ import org.junit.jupiter.api.Test
15
+
16
+ @Serializable
17
+ sealed class Animal {
18
+ abstract val name: String
19
+
20
+ @Serializable
21
+ data class Dog (override val name : String , val breed : String ) : Animal()
22
+
23
+ @Serializable
24
+ data class Cat (override val name : String , val color : String ) : Animal()
25
+ }
26
+
27
+ class SerializeAndDeserializeSealedClassUnitTest {
28
+
29
+ val moshi: Moshi = Moshi .Builder ()
30
+ .add(
31
+ PolymorphicJsonAdapterFactory .of(Animal ::class .java, " type" )
32
+ .withSubtype(Animal .Dog ::class .java, " dog" )
33
+ .withSubtype(Animal .Cat ::class .java, " cat" )
34
+ )
35
+ .add(KotlinJsonAdapterFactory ())
36
+ .build()
37
+
38
+ @Test
39
+ fun `serialize sealed class using kotlinx serialization library` () {
40
+ val dog = Animal .Dog (" Buddy" , " Labrador" )
41
+ val serializedDog = Json .encodeToString(dog)
42
+
43
+ val cat = Animal .Cat (" Mike" , " Black" )
44
+ val serializedCat = Json .encodeToString(cat)
45
+
46
+ assertEquals(" {\" name\" :\" Buddy\" ,\" breed\" :\" Labrador\" }" , serializedDog)
47
+ assertEquals(" {\" name\" :\" Mike\" ,\" color\" :\" Black\" }" , serializedCat)
48
+ }
49
+
50
+ @Test
51
+ fun `deserialize sealed class using kotlinx serialization library` () {
52
+ val json = Json {
53
+ serializersModule = SerializersModule {
54
+ polymorphic(Animal ::class ) {
55
+ subclass(Animal .Dog ::class , Animal .Dog .serializer())
56
+ subclass(Animal .Cat ::class , Animal .Cat .serializer())
57
+ }
58
+ }
59
+ }
60
+ val dog = Animal .Dog (" Buddy" , " Labrador" )
61
+ val serializedDog = json.encodeToString(Animal .serializer(), dog)
62
+ val deserializedDog = json.decodeFromString<Animal >(serializedDog)
63
+
64
+ assertEquals(dog, deserializedDog)
65
+
66
+ val cat = Animal .Cat (" Mike" , " Black" )
67
+ val serializedCat = json.encodeToString(Animal .serializer(), cat)
68
+ val deserializedCat = json.decodeFromString<Animal >(serializedCat)
69
+
70
+ assertEquals(cat, deserializedCat)
71
+ }
72
+
73
+ @Test
74
+ fun `serialize sealed class using moshi library` () {
75
+
76
+ val dog = Animal .Dog (" Buddy" , " Labrador" )
77
+ val cat = Animal .Cat (" Mike" , " Black" )
78
+
79
+ val jsonAdapter = moshi.adapter(Animal ::class .java)
80
+
81
+ val serializedDog = jsonAdapter.toJson(dog)
82
+ val serializedCat = jsonAdapter.toJson(cat)
83
+
84
+ assertEquals(" {\" type\" :\" dog\" ,\" name\" :\" Buddy\" ,\" breed\" :\" Labrador\" }" , serializedDog)
85
+ assertEquals(" {\" type\" :\" cat\" ,\" name\" :\" Mike\" ,\" color\" :\" Black\" }" , serializedCat)
86
+ }
87
+
88
+ @Test
89
+ fun `deserialize sealed class using moshi library` () {
90
+ val jsonAdapter = moshi.adapter(Animal ::class .java)
91
+
92
+ val serializedDog = """ {"type":"dog","name":"Buddy","breed":"Labrador"}"""
93
+ val deserializedDog = jsonAdapter.fromJson(serializedDog) as Animal .Dog
94
+
95
+ val serializedCat = """ {"type":"cat","name":"Mike","color":"Black"}"""
96
+ val deserializedCat = jsonAdapter.fromJson(serializedCat) as Animal .Cat
97
+
98
+ assertEquals(Animal .Dog (" Buddy" , " Labrador" ), deserializedDog)
99
+ assertEquals(Animal .Cat (" Mike" , " Black" ), deserializedCat)
100
+ }
101
+
102
+ }
0 commit comments