Don't throw when previous enum mapping is not found. (#49892)
authorSteve Molloy <smolloy@microsoft.com>
Mon, 29 Mar 2021 22:46:54 +0000 (15:46 -0700)
committerGitHub <noreply@github.com>
Mon, 29 Mar 2021 22:46:54 +0000 (15:46 -0700)
src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializationReaderILGen.cs
src/libraries/System.Runtime.Serialization.Xml/tests/System.Runtime.Serialization.Xml.Tests.csproj
src/libraries/System.Runtime.Serialization.Xml/tests/XmlSerializerTests.cs [new file with mode: 0644]

index e80a951..feb269c 100644 (file)
@@ -936,7 +936,7 @@ namespace System.Xml.Serialization
                 {
                     i++;
                     uniqueName = name + i.ToString(CultureInfo.InvariantCulture);
-                    m = Enums[uniqueName];
+                    Enums.TryGetValue(uniqueName, out m);
                 }
             }
             Enums.Add(uniqueName, mapping);
index 3080bd8..3992b33 100644 (file)
     <Compile Include="$(TestSourceFolder)SerializationTestTypes\DCRSampleType.cs" />
     <Compile Include="$(TestSourceFolder)SerializationTestTypes\DCRTypeLibrary.cs" />
     <Compile Include="$(TestSourceFolder)SerializationTestTypes\Primitives.cs" />
-    <Compile Include="$(CommonTestPath)System\IO\TempFile.cs"
-             Link="Common\System\IO\TempFile.cs" />
-    <Compile Include="$(CommonTestPath)System\Runtime\Serialization\DataContractSerializerHelper.cs"
-             Link="Common\System\Runtime\Serialization\DataContractSerializerHelper.cs" />
+    <Compile Include="$(CommonTestPath)System\IO\TempFile.cs" Link="Common\System\IO\TempFile.cs" />
+    <Compile Include="$(CommonTestPath)System\Runtime\Serialization\DataContractSerializerHelper.cs" Link="Common\System\Runtime\Serialization\DataContractSerializerHelper.cs" />
     <Compile Include="$(CommonTestPath)System\Runtime\Serialization\Utils.cs" />
     <Compile Include="$(TestSourceFolder)SerializationTestTypes\ObjRefSample.cs" />
     <Compile Include="SerializationTestTypes\Collections.cs" />
@@ -29,6 +27,7 @@
     <Compile Include="SerializationTestTypes\SampleIObjectRef.cs" />
     <Compile Include="SerializationTestTypes\SampleTypes.cs" />
     <Compile Include="SerializationTestTypes\SelfRefAndCycles.cs" />
+    <Compile Include="XmlSerializerTests.cs" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="$(LibrariesProjectRoot)System.CodeDom\src\System.CodeDom.csproj" />
diff --git a/src/libraries/System.Runtime.Serialization.Xml/tests/XmlSerializerTests.cs b/src/libraries/System.Runtime.Serialization.Xml/tests/XmlSerializerTests.cs
new file mode 100644 (file)
index 0000000..089e45d
--- /dev/null
@@ -0,0 +1,66 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.IO;
+using System.Xml;
+using System.Xml.Serialization;
+using Xunit;
+
+public static class XmlSerializerTests
+{
+
+    public const string FakeNS = "http://example.com/XmlSerializerTests";
+
+    [Fact]
+    public static void FlagEnums_With_Different_Namespaces()
+    {
+        StringWriter sw = new StringWriter();
+        XmlTextWriter xml = new XmlTextWriter(sw);
+
+        TwoClasses twoClasses = new TwoClasses
+        {
+            First = new FirstClass { TestingEnumValues = TestEnum.First },
+            Second = new SecondClass { TestingEnumValues = TestEnum.Second }
+        };
+
+        // 43675 - This line throws with inconsistent Flag.type/namespace usage
+        XmlSerializer ser = new XmlSerializer(typeof(TwoClasses));
+
+        ser.Serialize(xml, twoClasses);
+        string s = sw.ToString();
+
+        Assert.Contains("enumtest", s);
+    }
+
+    [Flags]
+    public enum TestEnum
+    {
+        First = 1,
+        Second = 2
+    }
+
+    public class FirstClass
+    {
+        [XmlAttribute("enumtest")]
+        public TestEnum TestingEnumValues;
+    }
+
+    public class SecondClass
+    {
+        [XmlAttribute("enumtest", Namespace = XmlSerializerTests.FakeNS)]
+        public TestEnum TestingEnumValues;
+    }
+
+    public class TwoClasses
+    {
+        public TwoClasses() { }
+
+        [XmlElement("first")]
+        public FirstClass First;
+
+        [XmlElement("second", Namespace = XmlSerializerTests.FakeNS)]
+        public SecondClass Second;
+    }
+
+}