Skip to content

Commit a69c227

Browse files
determine serializer type with kind
1 parent 2edc1d7 commit a69c227

File tree

1 file changed

+13
-17
lines changed

1 file changed

+13
-17
lines changed

formats/protobuf/commonMain/src/kotlinx/serialization/protobuf/internal/ProtobufDecoding.kt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ internal open class ProtobufDecoder(
208208
deserializer.descriptor == ByteArraySerializer().descriptor -> deserializeByteArray(previousValue as ByteArray?) as T
209209
deserializer is AbstractCollectionSerializer<*, *, *> ->
210210
(deserializer as AbstractCollectionSerializer<*, T, *>).merge(this, previousValue)
211-
(deserializer is AbstractPolymorphicSerializer && currentTag.isOneOf) -> decodeOneOfElement(deserializer)
211+
(deserializer.descriptor.kind is PolymorphicKind && currentTagOrDefault.isOneOf) -> decodeOneOfElement(deserializer)
212212
else -> deserializer.deserialize(this)
213213
}
214214

@@ -255,26 +255,22 @@ internal open class ProtobufDecoder(
255255
}
256256

257257
private fun <T> decodeOneOfElement(deserializer: DeserializationStrategy<T>): T {
258-
val tag = currentTagOrDefault
259-
if (tag.isOneOf && deserializer is AbstractPolymorphicSerializer) {
260-
// proto id of oneOf element is set as index-based.
261-
val index = tag.protoId - 1
262-
val protoId = index2IdMap!![index]
263-
val actualDeserializer = getActualOneOfSerializer(deserializer, protoId)
264-
?: throw SerializationException(
265-
"Cannot find a subclass of ${deserializer.descriptor.serialName} in property \"${
266-
descriptor.getElementName(index)
267-
}\" annotated with @ProtoNumber($protoId)."
268-
)
269-
return actualDeserializer.deserialize(this)
270-
} else {
271-
return decodeSerializableValue(deserializer)
272-
}
258+
// TODO deserialize oneOf element in contract of common polymorphic serializer rather than get actual deserializer by self
259+
// proto id of oneOf element is set as index-based.
260+
val index = currentTag.protoId - 1
261+
val protoId = index2IdMap!![index]
262+
val actualDeserializer = protoId?.let { getActualOneOfSerializer(deserializer, it) }
263+
?: throw SerializationException(
264+
"Cannot find a subclass of ${deserializer.descriptor.serialName} in property \"${
265+
descriptor.getElementName(index)
266+
}\" annotated with @ProtoNumber($protoId)."
267+
)
268+
return actualDeserializer.deserialize(this)
273269
}
274270

275271
private fun <T> getActualOneOfSerializer(
276272
deserializer: DeserializationStrategy<T>,
277-
protoId: Int?
273+
protoId: Int
278274
): DeserializationStrategy<T>? {
279275
return when (deserializer) {
280276
is PolymorphicSerializer -> {

0 commit comments

Comments
 (0)