diff --git a/bson-multiplatform/src/commonMain/kotlin/serialization/MultiplatformDecoder.kt b/bson-multiplatform/src/commonMain/kotlin/serialization/MultiplatformDecoder.kt index 42d48b7f..452c7121 100644 --- a/bson-multiplatform/src/commonMain/kotlin/serialization/MultiplatformDecoder.kt +++ b/bson-multiplatform/src/commonMain/kotlin/serialization/MultiplatformDecoder.kt @@ -196,9 +196,17 @@ internal class BsonCompositeDecoder( val iterator = source.iterator() lateinit var current: BsonDocument.Field override fun decodeElementIndex(descriptor: SerialDescriptor): Int { - if (!iterator.hasNext()) return CompositeDecoder.DECODE_DONE - current = iterator.next() - return descriptor.getElementIndex(current.name) + // If we find some field that the descriptor doesn't know about, + // just skip it entirely, don't try to deserialize it. + + while (iterator.hasNext()) { + current = iterator.next() + val index = descriptor.getElementIndex(current.name) + if (index != CompositeDecoder.UNKNOWN_NAME) { + return index + } + } + return CompositeDecoder.DECODE_DONE } override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean { diff --git a/bson-tests/src/commonMain/kotlin/BsonDocumentTests.kt b/bson-tests/src/commonMain/kotlin/BsonDocumentTests.kt index db2d4f02..bd0caa00 100644 --- a/bson-tests/src/commonMain/kotlin/BsonDocumentTests.kt +++ b/bson-tests/src/commonMain/kotlin/BsonDocumentTests.kt @@ -113,6 +113,16 @@ fun SuiteDsl.verifyBsonDocuments(factory: Prepared) = suite("BSON d check(exception.message matches "Could not decode opensavvy.ktmongo.bson.BsonDocumentUser.*\n\tfrom value \\{\"a\": \"Bob\"\\}.*\n*.*") } + test("Decode a single document with additional fields (must be ignored)") { + val document = factory().buildDocument { + writeString("a", "Bob") + writeInt32("b", 45) + writeDouble("ignored", 2.3) + } + + check(document.decode() == BsonDocumentUser("Bob", 45)) + } + test("Read a corrupt document") { checkThrows { // This document is malformed