@@ -208,7 +208,7 @@ internal open class ProtobufDecoder(
208
208
deserializer.descriptor == ByteArraySerializer ().descriptor -> deserializeByteArray(previousValue as ByteArray? ) as T
209
209
deserializer is AbstractCollectionSerializer <* , * , * > ->
210
210
(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)
212
212
else -> deserializer.deserialize(this )
213
213
}
214
214
@@ -255,26 +255,22 @@ internal open class ProtobufDecoder(
255
255
}
256
256
257
257
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 )
273
269
}
274
270
275
271
private fun <T > getActualOneOfSerializer (
276
272
deserializer : DeserializationStrategy <T >,
277
- protoId : Int?
273
+ protoId : Int
278
274
): DeserializationStrategy <T >? {
279
275
return when (deserializer) {
280
276
is PolymorphicSerializer -> {
0 commit comments