diff --git a/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs b/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs index 5a3149496967..b16be3de5a4d 100644 --- a/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs +++ b/src/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs @@ -799,30 +799,52 @@ private void WritePrimitive(TypeMapping mapping, string source) } else if (mapping.TypeDesc.FormatterName == "String") { - System.Diagnostics.Debug.Assert(source == "Reader.Value" || source == "Reader.ReadElementString()"); - MethodInfo XmlSerializationReader_get_Reader = typeof(XmlSerializationReader).GetMethod( - "get_Reader", - CodeGenerator.InstanceBindingFlags, - Array.Empty() - ); - MethodInfo XmlReader_method = typeof(XmlReader).GetMethod( - source == "Reader.Value" ? "get_Value" : "ReadElementContentAsString", - CodeGenerator.InstanceBindingFlags, - Array.Empty() - ); - if (mapping.TypeDesc.CollapseWhitespace) - ilg.Ldarg(0); - ilg.Ldarg(0); - ilg.Call(XmlSerializationReader_get_Reader); - ilg.Call(XmlReader_method); - if (mapping.TypeDesc.CollapseWhitespace) + System.Diagnostics.Debug.Assert(source == "Reader.Value" || source == "Reader.ReadElementString()" || source == "vals[i]"); + if (source == "vals[i]") + { + if (mapping.TypeDesc.CollapseWhitespace) + ilg.Ldarg(0); + LocalBuilder locVals = ilg.GetLocal("vals"); + LocalBuilder locI = ilg.GetLocal("i"); + ilg.LoadArrayElement(locVals, locI); + if (mapping.TypeDesc.CollapseWhitespace) + { + MethodInfo XmlSerializationReader_CollapseWhitespace = typeof(XmlSerializationReader).GetMethod( + "CollapseWhitespace", + CodeGenerator.InstanceBindingFlags, + null, + new Type[] { typeof(String) }, + null + ); + ilg.Call(XmlSerializationReader_CollapseWhitespace); + } + } + else { - MethodInfo XmlSerializationReader_CollapseWhitespace = typeof(XmlSerializationReader).GetMethod( - "CollapseWhitespace", + MethodInfo XmlSerializationReader_get_Reader = typeof(XmlSerializationReader).GetMethod( + "get_Reader", + CodeGenerator.InstanceBindingFlags, + Array.Empty() + ); + MethodInfo XmlReader_method = typeof(XmlReader).GetMethod( + source == "Reader.Value" ? "get_Value" : "ReadElementContentAsString", CodeGenerator.InstanceBindingFlags, - new Type[] { typeof(string) } + Array.Empty() ); - ilg.Call(XmlSerializationReader_CollapseWhitespace); + if (mapping.TypeDesc.CollapseWhitespace) + ilg.Ldarg(0); + ilg.Ldarg(0); + ilg.Call(XmlSerializationReader_get_Reader); + ilg.Call(XmlReader_method); + if (mapping.TypeDesc.CollapseWhitespace) + { + MethodInfo XmlSerializationReader_CollapseWhitespace = typeof(XmlSerializationReader).GetMethod( + "CollapseWhitespace", + CodeGenerator.InstanceBindingFlags, + new Type[] { typeof(string) } + ); + ilg.Call(XmlSerializationReader_CollapseWhitespace); + } } } else diff --git a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs index 92fdccdaa4f0..94249e9d5871 100644 --- a/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs +++ b/src/System.Private.Xml/tests/XmlSerializer/XmlSerializerTests.cs @@ -1691,6 +1691,22 @@ public static void SerializeWithDefaultValueSetToNegativeInfinityTest() Assert.True(result); } + [Fact] + public static void DeserializeIDREFSIntoStringTest() + { + string xmlstring = @""; + Stream ms = GenerateStreamFromString(xmlstring); + XmlSerializer ser = new XmlSerializer(typeof(MsgDocumentType)); + var value = (MsgDocumentType)ser.Deserialize(ms); + Assert.NotNull(value); + Assert.Equal("ID1", value.Id); + Assert.NotNull(value.Refs); + Assert.Equal(3, value.Refs.Count()); + Assert.Equal("ID1", value.Refs[0]); + Assert.Equal("ID2", value.Refs[1]); + Assert.Equal("ID3", value.Refs[2]); + } + private static bool SerializeWithDefaultValue(T value, string baseline) { XmlSerializer serializer = new XmlSerializer(typeof(T)); diff --git a/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs b/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs index f0f126cdf22b..a17e2a37d89f 100644 --- a/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs +++ b/src/System.Runtime.Serialization.Xml/tests/SerializationTypes.cs @@ -1243,3 +1243,15 @@ public int IntValue } } } + +[Serializable()] +[System.Xml.Serialization.XmlType("MsgDocumentType", Namespace = "http://example.com")] +[System.Xml.Serialization.XmlRoot("Document", Namespace = "http://example.com")] +public partial class MsgDocumentType +{ + [System.Xml.Serialization.XmlAttribute("id", DataType = "ID")] + public string Id { get; set; } + + [System.Xml.Serialization.XmlAttribute("refs", DataType = "IDREFS")] + public string[] Refs { get; set; } +}