From ee62aa78884496e28bc074043e586bad43b1a206 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Fri, 30 Jul 2021 11:13:42 +0300 Subject: [PATCH 1/5] Use ReflectionOnly as serialization mode in case dynamic code runtime feature is not supported --- .../System/Xml/Serialization/XmlSerializer.cs | 3 +- .../XmlSerializer_Deserialize/Program.cs | 48 +++++++++++++++++++ ...ator.XmlSerializer_Deserialize.Test.csproj | 19 ++++++++ 3 files changed, 69 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 049836211d752..f34a77917e5af 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,7 @@ internal enum SerializationMode public class XmlSerializer { - internal static SerializationMode Mode { get; set; } = SerializationMode.ReflectionAsBackup; + internal static SerializationMode Mode { get; set; } = RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; 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 0000000000000..9fa41cb3d9048 --- /dev/null +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs @@ -0,0 +1,48 @@ +// 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 +{ + [DllImport("__Internal")] + public static extern void mono_ios_set_summary (string value); + + public static async Task Main(string[] args) + { + mono_ios_set_summary($"Starting functional test"); + + 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 0000000000000..e56efb092cec7 --- /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 + + + + + + From 168004ed08ca722b41521d2c51b6e727499eaf28 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Fri, 30 Jul 2021 14:01:42 +0300 Subject: [PATCH 2/5] Update src/libraries/System.Private.Xml/src/System/Xml/Serialization/XmlSerializer.cs Co-authored-by: Jan Kotas --- .../src/System/Xml/Serialization/XmlSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f34a77917e5af..8a1383b7f8485 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 @@ -110,7 +110,7 @@ internal enum SerializationMode public class XmlSerializer { - internal static SerializationMode Mode { get; set; } = RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; + internal static SerializationMode Mode => RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; private static bool ReflectionMethodEnabled { From 58df21ef7b4041d9bd3613097d2a057531f994c9 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Fri, 30 Jul 2021 13:52:05 +0300 Subject: [PATCH 3/5] Remove an unnecessary internal call --- .../iOS/Simulator/XmlSerializer_Deserialize/Program.cs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs index 9fa41cb3d9048..05da0aed4b2c5 100644 --- a/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlSerializer_Deserialize/Program.cs @@ -12,13 +12,8 @@ public static class Program { - [DllImport("__Internal")] - public static extern void mono_ios_set_summary (string value); - public static async Task Main(string[] args) { - mono_ios_set_summary($"Starting functional test"); - using StringReader stringReader = new StringReader(@" sample From 88144ed257fbe39c819e50b703eab48006b75911 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Fri, 30 Jul 2021 15:24:51 +0300 Subject: [PATCH 4/5] Revert Mode to usual property --- .../src/System/Xml/Serialization/XmlSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8a1383b7f8485..f34a77917e5af 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 @@ -110,7 +110,7 @@ internal enum SerializationMode public class XmlSerializer { - internal static SerializationMode Mode => RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; + internal static SerializationMode Mode { get; set; } = RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; private static bool ReflectionMethodEnabled { From 426ad9f037d78bb78863a21868f492e895a4b520 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Mon, 2 Aug 2021 09:06:38 +0300 Subject: [PATCH 5/5] Make Mode property linker-friendly --- .../src/System/Xml/Serialization/XmlSerializer.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 f34a77917e5af..de4eb5155bdd3 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 @@ -110,7 +110,13 @@ internal enum SerializationMode public class XmlSerializer { - internal static SerializationMode Mode { get; set; } = RuntimeFeature.IsDynamicCodeSupported ? SerializationMode.ReflectionAsBackup : SerializationMode.ReflectionOnly; + 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 {