-Refactor JsonSerializer.Binder to not create wrapper when unneeded

This commit is contained in:
James Newton-King
2017-06-18 12:36:27 +12:00
parent 91783ff319
commit 928eea8340
3 changed files with 27 additions and 5 deletions
@@ -1336,7 +1336,7 @@ namespace Newtonsoft.Json.Tests.Serialization
Assert.AreEqual(customBinder, serializer.Binder);
#pragma warning restore CS0618 // Type or member is obsolete
Assert.IsInstanceOf(typeof(SerializationBinderAdapter), serializer.SerializationBinder);
Assert.IsInstanceOf(typeof(DefaultSerializationBinder), serializer.SerializationBinder);
serializer.SerializationBinder = customBinder;
Assert.AreEqual(customBinder, serializer.SerializationBinder);
@@ -1570,7 +1570,7 @@ namespace Newtonsoft.Json.Tests.Serialization
Assert.AreEqual(customBinder, serializerProxy.Binder);
#pragma warning restore CS0618 // Type or member is obsolete
Assert.IsInstanceOf(typeof(SerializationBinderAdapter), serializerProxy.SerializationBinder);
Assert.IsInstanceOf(typeof(DefaultSerializationBinder), serializerProxy.SerializationBinder);
serializerProxy.SerializationBinder = customBinder;
Assert.AreEqual(customBinder, serializerProxy.SerializationBinder);
@@ -2151,6 +2151,21 @@ namespace Newtonsoft.Json.Tests.Serialization
Assert.IsInstanceOf(typeof(FancyBinder), serializer.SerializationBinder);
}
[Test]
public void SetOldBinderAndSerializationBinderReturnsWrapper()
{
var serializer = JsonSerializer.Create(new JsonSerializerSettings() { Binder = new OldBinder() });
#pragma warning disable CS0618 // Type or member is obsolete
Assert.IsInstanceOf(typeof(OldBinder), serializer.Binder);
#pragma warning restore CS0618 // Type or member is obsolete
var binder = serializer.SerializationBinder;
Assert.IsInstanceOf(typeof(SerializationBinderAdapter), binder);
Assert.AreEqual(typeof(string), binder.BindToType(null, null));
}
public class FancyBinder : ISerializationBinder
{
private static readonly string Annotate = new string(':', 3);
@@ -2166,6 +2181,14 @@ namespace Newtonsoft.Json.Tests.Serialization
return null;
}
}
public class OldBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
return typeof(string);
}
}
#endif
}
+2 -3
View File
@@ -111,8 +111,7 @@ namespace Newtonsoft.Json
return null;
}
SerializationBinder legacySerializationBinder = _serializationBinder as SerializationBinder;
if (legacySerializationBinder != null)
if (_serializationBinder is SerializationBinder legacySerializationBinder)
{
return legacySerializationBinder;
}
@@ -132,7 +131,7 @@ namespace Newtonsoft.Json
throw new ArgumentNullException(nameof(value), "Serialization binder cannot be null.");
}
_serializationBinder = new SerializationBinderAdapter(value);
_serializationBinder = value as ISerializationBinder ?? new SerializationBinderAdapter(value);
}
}