<PackageReference Include="Newtonsoft.Json" Version="6.0.8" />

DefaultSerializationBinder

The default serialization binder used when resolving and loading classes from type names.
using Newtonsoft.Json.Utilities; using System; using System.Globalization; using System.Reflection; namespace Newtonsoft.Json.Serialization { public class DefaultSerializationBinder : SerializationBinder { internal struct TypeNameKey : IEquatable<TypeNameKey> { internal readonly string AssemblyName; internal readonly string TypeName; public TypeNameKey(string assemblyName, string typeName) { AssemblyName = assemblyName; TypeName = typeName; } public override int GetHashCode() { return ((AssemblyName != null) ? AssemblyName.GetHashCode() : 0) ^ ((TypeName != null) ? TypeName.GetHashCode() : 0); } public override bool Equals(object obj) { if (!(obj is TypeNameKey)) return false; return Equals((TypeNameKey)obj); } public bool Equals(TypeNameKey other) { if (AssemblyName == other.AssemblyName) return TypeName == other.TypeName; return false; } } internal static readonly DefaultSerializationBinder Instance = new DefaultSerializationBinder(); private readonly ThreadSafeStore<TypeNameKey, Type> _typeCache = new ThreadSafeStore<TypeNameKey, Type>(GetTypeFromTypeNameKey); private static Type GetTypeFromTypeNameKey(TypeNameKey typeNameKey) { string assemblyName = typeNameKey.AssemblyName; string typeName = typeNameKey.TypeName; if (assemblyName != null) { Assembly assembly = Assembly.Load(new AssemblyName(assemblyName)); if ((object)assembly == null) throw new JsonSerializationException("Could not load assembly '{0}'.".FormatWith(CultureInfo.InvariantCulture, assemblyName)); Type type = assembly.GetType(typeName); if ((object)type == null) throw new JsonSerializationException("Could not find type '{0}' in assembly '{1}'.".FormatWith(CultureInfo.InvariantCulture, typeName, assembly.FullName)); return type; } return Type.GetType(typeName); } public override Type BindToType(string assemblyName, string typeName) { return _typeCache.Get(new TypeNameKey(assemblyName, typeName)); } public override void BindToName(Type serializedType, out string assemblyName, out string typeName) { assemblyName = serializedType.GetTypeInfo().get_Assembly().FullName; typeName = serializedType.FullName; } } }