using System.Collections.Generic;
using System.Xml.Serialization;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO.Compression;
using System.Collections.Concurrent;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Extensions.Logging;
static int NumberOfFailures = 0;
private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
Console.WriteLine("Failed trying to resolve {0}", args.Name);
public static void Test()
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
var formatter = new XmlSerializerOutputFormatter();
int startNumberOfFailures = NumberOfFailures;
for (int i = 0; i < 12; i++)
var v = formatter.GetType().GetMethod("CanWriteType", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Invoke(formatter, new [] { dto.GetType() });
Console.WriteLine("Caught {0}", ex);
int endNumberOfFailures = NumberOfFailures;
Console.WriteLine("Total number of resolve failures when calling XmlSerializerOutputFormatter.CanWriteType({0}): {1}", dto.GetType().Name, endNumberOfFailures - startNumberOfFailures);
public static void Main()
Console.WriteLine("Environment version: {0} ({1}), {2}.", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , Environment.Version, Environment.OSVersion);
Console.WriteLine("Failed with unhandled exception: ");
public static class XmlSerializerFactory
static readonly ConcurrentDictionary<Type, XmlSerializer> Serializers = new ConcurrentDictionary<Type, XmlSerializer>();
static readonly ConcurrentDictionary<ValueTuple<Type, string>, XmlSerializer> SerializersWithNamespace = new ConcurrentDictionary<ValueTuple<Type, string>, XmlSerializer>();
public static XmlSerializer Create(Type type) { return Serializers.GetOrAdd(type, (t) => new XmlSerializer(t)); }
public static XmlSerializer Create(Type type, string defaultNamespace) { return SerializersWithNamespace.GetOrAdd(ValueTuple.Create(type, defaultNamespace), (t) => new XmlSerializer(t.Item1, t.Item2)); }