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; }
+}