@@ -6,6 +6,7 @@ import kotlinx.serialization.InternalSerializationApi
6
6
import kotlinx.serialization.KSerializer
7
7
import kotlinx.serialization.SerialName
8
8
import kotlinx.serialization.Serializable
9
+ import kotlinx.serialization.SerializationException
9
10
import kotlinx.serialization.UseSerializers
10
11
import kotlinx.serialization.descriptors.PrimitiveKind
11
12
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@@ -135,15 +136,23 @@ enum class KernelStatus {
135
136
}
136
137
137
138
object MessageTypeSerializer : KSerializer<MessageType> {
139
+ private val cache: MutableMap <String , MessageType > = hashMapOf()
140
+
141
+ private fun getMessageType (type : String ): MessageType {
142
+ return cache.computeIfAbsent(type) { newType ->
143
+ MessageType .values().firstOrNull { it.type == newType }
144
+ ? : throw SerializationException (" Unknown message type: $newType " )
145
+ }
146
+ }
147
+
138
148
override val descriptor: SerialDescriptor =
139
149
PrimitiveSerialDescriptor (
140
150
MessageType ::class .qualifiedName!! ,
141
151
PrimitiveKind .STRING
142
152
)
143
153
144
154
override fun deserialize (decoder : Decoder ): MessageType {
145
- val type = decoder.decodeString()
146
- return MessageType .values().first { it.type == type }
155
+ return getMessageType(decoder.decodeString())
147
156
}
148
157
149
158
override fun serialize (encoder : Encoder , value : MessageType ) {
@@ -152,15 +161,23 @@ object MessageTypeSerializer : KSerializer<MessageType> {
152
161
}
153
162
154
163
object DetailsLevelSerializer : KSerializer<DetailLevel> {
164
+ private val cache: MutableMap <Int , DetailLevel > = hashMapOf()
165
+
166
+ private fun getDetailsLevel (type : Int ): DetailLevel {
167
+ return cache.computeIfAbsent(type) { newLevel ->
168
+ DetailLevel .values().firstOrNull { it.level == newLevel }
169
+ ? : throw SerializationException (" Unknown details level: $newLevel " )
170
+ }
171
+ }
172
+
155
173
override val descriptor: SerialDescriptor =
156
174
PrimitiveSerialDescriptor (
157
175
DetailLevel ::class .qualifiedName!! ,
158
176
PrimitiveKind .INT
159
177
)
160
178
161
179
override fun deserialize (decoder : Decoder ): DetailLevel {
162
- val level = decoder.decodeInt()
163
- return DetailLevel .values().first { it.level == level }
180
+ return getDetailsLevel(decoder.decodeInt())
164
181
}
165
182
166
183
override fun serialize (encoder : Encoder , value : DetailLevel ) {
0 commit comments