From 928eea83404b12916a85e47f61df6f4e1af2e121 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 18 Jun 2017 12:36:27 +1200 Subject: [PATCH] -Refactor JsonSerializer.Binder to not create wrapper when unneeded --- .../Serialization/JsonSerializerTest.cs | 4 ++-- .../Serialization/TypeNameHandlingTests.cs | 23 +++++++++++++++++++ Src/Newtonsoft.Json/JsonSerializer.cs | 5 ++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 20a8478d..35a00c5b 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -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); diff --git a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs index fe9db75b..f06fda57 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/TypeNameHandlingTests.cs @@ -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 } diff --git a/Src/Newtonsoft.Json/JsonSerializer.cs b/Src/Newtonsoft.Json/JsonSerializer.cs index d87368b6..caf171d0 100644 --- a/Src/Newtonsoft.Json/JsonSerializer.cs +++ b/Src/Newtonsoft.Json/JsonSerializer.cs @@ -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); } }