diff --git a/src/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs b/src/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs index 9ceff52d22dc..8b444f8cf6c1 100644 --- a/src/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs +++ b/src/System.Private.Xml/src/System/Xml/Core/XsdValidatingReader.cs @@ -1011,13 +1011,13 @@ public override string ReadElementContentAsString() try { - if (xmlType != null) + if (xmlType != null && typedValue != null) { return xmlType.ValueConverter.ToString(typedValue); } else { - return typedValue as string; + return typedValue as string ?? string.Empty; } } catch (InvalidCastException e) diff --git a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs index c087ca20b298..c6b8fdcd799f 100644 --- a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs +++ b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs @@ -1763,6 +1763,77 @@ public static void Xml_TypeWithMismatchBetweenAttributeAndPropertyType() Assert.StrictEqual(value.IntValue, actual.IntValue); } + [Fact] + public static void Xml_XsdValidationAndDeserialization() + { + var xsdstring = @" + + + + + + + + + + + + + + + + + + + + + + + + + + +"; + var param = "" + + "" + + "" + + "" + + "" + + "" + + "" + + ""; + + using (var stream = new MemoryStream()) + { + using (var writer = new StreamWriter(stream)) + { + writer.Write(param); + writer.Flush(); + stream.Position = 0; + + var xmlReaderSettings = new XmlReaderSettings(); + xmlReaderSettings.ValidationType = ValidationType.Schema; + xmlReaderSettings.ValidationEventHandler += (sender, args) => + { + throw new XmlSchemaValidationException(args.Message); + }; + xmlReaderSettings.Schemas.Add(null, XmlReader.Create(new StringReader(xsdstring))); + + var xmlReader = XmlReader.Create(stream, xmlReaderSettings); + + var overrides = new XmlAttributeOverrides(); + var parametersXmlAttribute = new XmlAttributes { XmlType = new XmlTypeAttribute("stringParameter") }; + overrides.Add(typeof(Parameter), parametersXmlAttribute); + + var serializer = new XmlSerializer(typeof(RootClass), overrides); + var result=(RootClass)serializer.Deserialize(xmlReader); + + Assert.Equal("SomeName", result.Parameters[0].Name); + Assert.Equal(string.Empty, ((Parameter)result.Parameters[0]).Value); + } + } + } + private static readonly string s_defaultNs = "http://tempuri.org/"; private static T RoundTripWithXmlMembersMapping(object requestBodyValue, string memberName, string baseline, bool skipStringCompare = false, string wrapperName = null) { diff --git a/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs b/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs index 4e379eb8b845..7e41d5cc14d8 100644 --- a/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs +++ b/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs @@ -1264,3 +1264,21 @@ public partial class MsgDocumentType [System.Xml.Serialization.XmlAttribute("refs", DataType = "IDREFS")] public string[] Refs { get; set; } } + +public class RootClass +{ + [XmlArray] + public List Parameters { get; set; } +} + +[XmlInclude(typeof(Parameter))] +public class Parameter +{ + [XmlAttribute] + public string Name { get; set; } +} + +public class Parameter : Parameter +{ + public T Value { get; set; } +}