@@ -6,6 +6,7 @@ import kotlinx.serialization.InternalSerializationApi
66import kotlinx.serialization.KSerializer
77import kotlinx.serialization.SerialName
88import kotlinx.serialization.Serializable
9+ import kotlinx.serialization.SerializationException
910import kotlinx.serialization.UseSerializers
1011import kotlinx.serialization.descriptors.PrimitiveKind
1112import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@@ -135,15 +136,23 @@ enum class KernelStatus {
135136}
136137
137138object 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+
138148 override val descriptor: SerialDescriptor =
139149 PrimitiveSerialDescriptor (
140150 MessageType ::class .qualifiedName!! ,
141151 PrimitiveKind .STRING
142152 )
143153
144154 override fun deserialize (decoder : Decoder ): MessageType {
145- val type = decoder.decodeString()
146- return MessageType .values().first { it.type == type }
155+ return getMessageType(decoder.decodeString())
147156 }
148157
149158 override fun serialize (encoder : Encoder , value : MessageType ) {
@@ -152,15 +161,23 @@ object MessageTypeSerializer : KSerializer<MessageType> {
152161}
153162
154163object 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+
155173 override val descriptor: SerialDescriptor =
156174 PrimitiveSerialDescriptor (
157175 DetailLevel ::class .qualifiedName!! ,
158176 PrimitiveKind .INT
159177 )
160178
161179 override fun deserialize (decoder : Decoder ): DetailLevel {
162- val level = decoder.decodeInt()
163- return DetailLevel .values().first { it.level == level }
180+ return getDetailsLevel(decoder.decodeInt())
164181 }
165182
166183 override fun serialize (encoder : Encoder , value : DetailLevel ) {
0 commit comments