diff --git a/src/AvroConvert/AvroObjectServices/Read/Resolvers/Record.cs b/src/AvroConvert/AvroObjectServices/Read/Resolvers/Record.cs index 70f031f..9027e37 100644 --- a/src/AvroConvert/AvroObjectServices/Read/Resolvers/Record.cs +++ b/src/AvroConvert/AvroObjectServices/Read/Resolvers/Record.cs @@ -1,4 +1,4 @@ -#region license +#region license /**Copyright (c) 2023 Adrian Strugała * @@ -97,15 +97,16 @@ protected virtual object ResolveRecord( if (readStepValue.ShouldSkip) { _skipper.Skip(readStepValue.WriteFieldSchema.TypeSchema, reader); - break; } - - accessor[result, readStep.Key] = - GetValue( - readStepValue.WriteFieldSchema, - readStepValue.ReadFieldSchema, - readStepValue.MemberInfo, - reader); + else + { + accessor[result, readStep.Key] = + GetValue( + readStepValue.WriteFieldSchema, + readStepValue.ReadFieldSchema, + readStepValue.MemberInfo, + reader); + } } } diff --git a/tests/AvroConvertTests/FullSerializationAndDeserialization/ClassesWithMismatchedFieldsTests.cs b/tests/AvroConvertTests/FullSerializationAndDeserialization/ClassesWithMismatchedFieldsTests.cs new file mode 100644 index 0000000..16fce24 --- /dev/null +++ b/tests/AvroConvertTests/FullSerializationAndDeserialization/ClassesWithMismatchedFieldsTests.cs @@ -0,0 +1,79 @@ +using SolTechnology.Avro; +using Xunit; + +namespace AvroConvertComponentTests.FullSerializationAndDeserialization +{ + public class ClassesWithMismatchedFieldsTests + { + [Fact] + public void Write_schema_with_additional_field_in_array_can_be_read() + { + //Arrange + var write = new WriteModel + { + Models = new[] + { + new WriteModelWithAdditionalField + { + StringValue = "string value", + DecimalValue = 123.456m, + IntValue = 10 + }, + new WriteModelWithAdditionalField + { + StringValue = "string value", + DecimalValue = 123.456m, + IntValue = 10 + } + }, + FinalField = 456.789m + }; + + var writeSchema = AvroConvert.GenerateSchema(typeof(WriteModel)); + var readSchema = AvroConvert.GenerateSchema(typeof(ReadModel)); + + //Act + var serialized = AvroConvert.SerializeHeadless(write, writeSchema); + var result = AvroConvert.DeserializeHeadless(serialized, writeSchema, readSchema, typeof(ReadModel)) as ReadModel; + + //Assert + Assert.NotNull(result); + Assert.Equal(2, result.Models.Length); + Assert.Equal("string value", result.Models[0].StringValue); + Assert.Equal(10, result.Models[0].IntValue); + Assert.Equal("string value", result.Models[1].StringValue); + Assert.Equal(10, result.Models[1].IntValue); + Assert.Equal(456.789m, result.FinalField); + } + + public class WriteModel + { + public WriteModelWithAdditionalField[] Models { get; set; } + + public decimal FinalField { get; set; } + } + + public class WriteModelWithAdditionalField + { + public string StringValue { get; set; } + + public decimal DecimalValue { get; set; } + + public int IntValue { get; set; } + } + + public class ReadModel + { + public ReadModelWithMissingField[] Models { get; set; } + + public decimal FinalField { get; set; } + } + + public class ReadModelWithMissingField + { + public string StringValue { get; set; } + + public int IntValue { get; set; } + } + } +}