Skip to content

Commit 884f905

Browse files
committed
Make serialization/deserialization more efficient and add cleaner exception messages
Relates to #271
1 parent 77780bd commit 884f905

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

src/main/kotlin/org/jetbrains/kotlinx/jupyter/message_types.kt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import kotlinx.serialization.InternalSerializationApi
66
import kotlinx.serialization.KSerializer
77
import kotlinx.serialization.SerialName
88
import kotlinx.serialization.Serializable
9+
import kotlinx.serialization.SerializationException
910
import kotlinx.serialization.UseSerializers
1011
import kotlinx.serialization.descriptors.PrimitiveKind
1112
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@@ -135,15 +136,23 @@ enum class KernelStatus {
135136
}
136137

137138
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+
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

154163
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+
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

Comments
 (0)