From f289f98f3ab6e7204a2537ba7e2716ffc4f9d261 Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Mon, 12 Jul 2021 15:25:17 +0300 Subject: [PATCH 1/4] Use ReflectionOnly as data contract serializer option for iOS/tvOS/MacCatalyst --- .../Serialization/DataContractSerializer.cs | 12 +++++++- .../XmlFormatWriterGeneratorAOT/Program.cs | 30 +++++++++++++++++++ ...or.XmlFormatWriterGeneratorAot.Test.csproj | 19 ++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/Program.cs create mode 100644 src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/iOS.Simulator.XmlFormatWriterGeneratorAot.Test.csproj diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs index 71f4530f4f3d1..7ec3793d7bd18 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs @@ -34,7 +34,17 @@ public sealed class DataContractSerializer : XmlObjectSerializer private ISerializationSurrogateProvider? _serializationSurrogateProvider; private bool _serializeReadOnlyTypes; - private static SerializationOption _option = IsReflectionBackupAllowed() ? SerializationOption.ReflectionAsBackup : SerializationOption.CodeGenOnly; + private static SerializationOption _option = SetSerializationOption(); + + private static SerializationOption SetSerializationOption() + { + if (OperatingSystem.IsIOS() || OperatingSystem.IsTvOS() || OperatingSystem.IsMacCatalyst()) + { + return SerializationOption.ReflectionOnly; + } + + return IsReflectionBackupAllowed() ? SerializationOption.ReflectionAsBackup : SerializationOption.CodeGenOnly; + } private static bool _optionAlreadySet; internal static SerializationOption Option { diff --git a/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/Program.cs b/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/Program.cs new file mode 100644 index 0000000000000..884dfa7ae893b --- /dev/null +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/Program.cs @@ -0,0 +1,30 @@ +// 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.Runtime.InteropServices; +using System.Runtime.Serialization; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; + +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"); + + var ds = new DataContractSerializer (typeof (IEnumerable)); + using (var xw = XmlWriter.Create (System.IO.Stream.Null)) + ds.WriteObject (xw, new int [] { 1, 2, 3 }); + + Console.WriteLine("Done!"); + await Task.Delay(5000); + + return 42; + } +} diff --git a/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/iOS.Simulator.XmlFormatWriterGeneratorAot.Test.csproj b/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/iOS.Simulator.XmlFormatWriterGeneratorAot.Test.csproj new file mode 100644 index 0000000000000..f0a56aa7fdf05 --- /dev/null +++ b/src/tests/FunctionalTests/iOS/Simulator/XmlFormatWriterGeneratorAOT/iOS.Simulator.XmlFormatWriterGeneratorAot.Test.csproj @@ -0,0 +1,19 @@ + + + + Exe + false + true + true + $(NetCoreAppCurrent) + iOSSimulator + iOS.Simulator.XmlFormatWriterGeneratorAot.Test.dll + false + 42 + true + + + + + + From d34d451434964b1be0a239d6fa726ea81ba65cca Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Mon, 12 Jul 2021 15:43:57 +0300 Subject: [PATCH 2/4] Use more appropriate method name --- .../System/Runtime/Serialization/DataContractSerializer.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs index 7ec3793d7bd18..3c7a76d8ce18f 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs @@ -34,9 +34,8 @@ public sealed class DataContractSerializer : XmlObjectSerializer private ISerializationSurrogateProvider? _serializationSurrogateProvider; private bool _serializeReadOnlyTypes; - private static SerializationOption _option = SetSerializationOption(); - - private static SerializationOption SetSerializationOption() + private static SerializationOption _option = GetDefaultSerializationOption(); + private static SerializationOption GetDefaultSerializationOption() { if (OperatingSystem.IsIOS() || OperatingSystem.IsTvOS() || OperatingSystem.IsMacCatalyst()) { From 3756ea55216a0635bce915661760de5e3cd866bd Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Mon, 12 Jul 2021 22:52:47 +0300 Subject: [PATCH 3/4] Directly overwrite Option property to make it linker-friendly --- .../src/ILLink/ILLink.Substitutions.xml | 5 +++++ .../System.Private.DataContractSerialization.csproj | 3 +++ .../Runtime/Serialization/DataContractSerializer.cs | 11 +---------- 3 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml diff --git a/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml b/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml new file mode 100644 index 0000000000000..6205f1177bed6 --- /dev/null +++ b/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj b/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj index 57474c6e2464b..28c4fa06c95c5 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj +++ b/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj @@ -7,6 +7,9 @@ false enable + + + System\Runtime\Serialization System\Runtime\Serialization\Json diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs index 3c7a76d8ce18f..71f4530f4f3d1 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs @@ -34,16 +34,7 @@ public sealed class DataContractSerializer : XmlObjectSerializer private ISerializationSurrogateProvider? _serializationSurrogateProvider; private bool _serializeReadOnlyTypes; - private static SerializationOption _option = GetDefaultSerializationOption(); - private static SerializationOption GetDefaultSerializationOption() - { - if (OperatingSystem.IsIOS() || OperatingSystem.IsTvOS() || OperatingSystem.IsMacCatalyst()) - { - return SerializationOption.ReflectionOnly; - } - - return IsReflectionBackupAllowed() ? SerializationOption.ReflectionAsBackup : SerializationOption.CodeGenOnly; - } + private static SerializationOption _option = IsReflectionBackupAllowed() ? SerializationOption.ReflectionAsBackup : SerializationOption.CodeGenOnly; private static bool _optionAlreadySet; internal static SerializationOption Option { From e9e0959b6e104f5bb202165b4e5ab2fcb64a50dd Mon Sep 17 00:00:00 2001 From: Maxim Lipnin Date: Tue, 13 Jul 2021 11:04:52 +0300 Subject: [PATCH 4/4] Change the Option property --- .../src/ILLink/ILLink.Substitutions.xml | 5 ----- .../src/System.Private.DataContractSerialization.csproj | 3 --- .../System/Runtime/Serialization/DataContractSerializer.cs | 2 +- 3 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml diff --git a/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml b/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml deleted file mode 100644 index 6205f1177bed6..0000000000000 --- a/src/libraries/System.Private.DataContractSerialization/src/ILLink/ILLink.Substitutions.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj b/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj index 28c4fa06c95c5..57474c6e2464b 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj +++ b/src/libraries/System.Private.DataContractSerialization/src/System.Private.DataContractSerialization.csproj @@ -7,9 +7,6 @@ false enable - - - System\Runtime\Serialization System\Runtime\Serialization\Json diff --git a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs index 71f4530f4f3d1..72229faaf8d3c 100644 --- a/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs +++ b/src/libraries/System.Private.DataContractSerialization/src/System/Runtime/Serialization/DataContractSerializer.cs @@ -38,7 +38,7 @@ public sealed class DataContractSerializer : XmlObjectSerializer private static bool _optionAlreadySet; internal static SerializationOption Option { - get { return _option; } + get { return RuntimeFeature.IsDynamicCodeSupported ? _option : SerializationOption.ReflectionOnly; } set { if (_optionAlreadySet)