Skip to content

Commit

Permalink
Use ReflectionOnly as serialization mode in case dynamic code runtime…
Browse files Browse the repository at this point in the history
… feature is not supported (#56604)
  • Loading branch information
MaximLipnin authored Aug 3, 2021
1 parent 7f931b1 commit b3ab2eb
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
{
Expand Down
Original file line number Diff line number Diff line change
@@ -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<int> Main(string[] args)
{
using StringReader stringReader = new StringReader(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<TestClass>
<TestData>sample</TestData>
</TestClass>");

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; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk" TreatAsLocalProperty="MonoForceInterpreter">

<PropertyGroup>
<OutputType>Exe</OutputType>
<MonoForceInterpreter>false</MonoForceInterpreter>
<RunAOTCompilation>true</RunAOTCompilation>
<TestRuntime>true</TestRuntime>
<TargetFrameworks>$(NetCoreAppCurrent)</TargetFrameworks>
<TargetOS Condition="'$(TargetOS)' == ''">iOSSimulator</TargetOS>
<MainLibraryFileName>iOS.Simulator.XmlSerializer_Deserialize.Test.dll</MainLibraryFileName>
<IncludesTestRunner>false</IncludesTestRunner>
<ExpectedExitCode>42</ExpectedExitCode>
<EnableAggressiveTrimming>true</EnableAggressiveTrimming>
</PropertyGroup>

<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
</Project>

0 comments on commit b3ab2eb

Please sign in to comment.