From b3ab2eb4db830f6c520340f80651b806fd9dfce8 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Tue, 3 Aug 2021 12:27:15 +0300 Subject: [PATCH] Use ReflectionOnly as serialization mode in case dynamic code runtime feature is not supported (#56604) --- .../System/Xml/Serialization/XmlSerializer.cs | 9 +++- .../XmlSerializer_Deserialize/Program.cs | 43 +++++++++++++++++++ ...ator.XmlSerializer_Deserialize.Test.csproj | 19 ++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs create mode 100644 src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/iOS.Simulator.XmlSerializer_Deserialize.Test.csproj diff --git a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs index 049836211d7522..de4eb5155bdd37 100644 --- a/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs +++ b/src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs @@ -9,6 +9,7 @@ using System.Globalization; using System.IO; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Text; @@ -109,7 +110,13 @@ internal enum SerializationMode public class XmlSerializer { - internal static SerializationMode Mode { get; set; } = SerializationMode.ReflectionAsBackup; + private static SerializationMode s_mode = SerializationMode.ReflectionAsBackup; + + internal static SerializationMode Mode + { + get => RuntimeFeature.IsDynamicCodeSupported ? s_mode : SerializationMode.ReflectionOnly; + set => s_mode = value; + } private static bool ReflectionMethodEnabled { diff --git a/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs new file mode 100644 index 00000000000000..05da0aed4b2c5b --- /dev/null +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs @@ -0,0 +1,43 @@ +// 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.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; + +public static class Program +{ + public static async Task Main(string[] args) + { + using StringReader stringReader = new StringReader(@" + + sample + "); + + var serializer = new XmlSerializer(typeof(TestClass)); + TestClass obj = (TestClass)serializer.Deserialize(stringReader); + + var result = obj.TestData == "sample" ? 42 : 1; + + Console.WriteLine("Done!"); + await Task.Delay(5000); + + return result; + } + + [XmlType("TestClass", AnonymousType = true, Namespace = "")] + public class TestClass + { + public TestClass() + { + } + + [XmlElement("TestData")] + public string TestData { get; set; } + } +} diff --git a/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/iOS.Simulator.XmlSerializer_Deserialize.Test.csproj b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/iOS.Simulator.XmlSerializer_Deserialize.Test.csproj new file mode 100644 index 00000000000000..e56efb092cec72 --- /dev/null +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/iOS.Simulator.XmlSerializer_Deserialize.Test.csproj @@ -0,0 +1,19 @@ + + + + Exe + false + true + true + $(NetCoreAppCurrent) + iOSSimulator + iOS.Simulator.XmlSerializer_Deserialize.Test.dll + false + 42 + true + + + + + +