From 48be21d4cebda1e849508efe816719223dbef238 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 4 Nov 2017 17:53:17 +1300 Subject: [PATCH] -Changed ISerializable serialization to require SerializableAttribute --- .../Serialization/ContractResolverTests.cs | 9 +++++++++ .../Serialization/ReferenceLoopHandlingTests.cs | 2 ++ .../TestObjects/ISerializableTestObject.cs | 1 + .../ISerializableWithoutAttributeTestObject.cs | 13 +++++++++++++ .../PreserveReferencesCallbackTestObject.cs | 2 ++ Src/Newtonsoft.Json.Tests/TestObjects/Ratio.cs | 1 + .../Serialization/DefaultContractResolver.cs | 2 +- .../Serialization/JsonTypeReflector.cs | 6 ++++-- 8 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 Src/Newtonsoft.Json.Tests/TestObjects/ISerializableWithoutAttributeTestObject.cs diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs index dd73919e..ebd7ddf3 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs @@ -125,6 +125,15 @@ namespace Newtonsoft.Json.Tests.Serialization Assert.AreEqual(JsonContractType.Serializable, contract.ContractType); } + [Test] + public void ResolveSerializableWithoutAttributeContract() + { + DefaultContractResolver contractResolver = new DefaultContractResolver(); + JsonContract contract = contractResolver.ResolveContract(typeof(ISerializableWithoutAttributeTestObject)); + + Assert.AreEqual(JsonContractType.Object, contract.ContractType); + } + [Test] public void ResolveObjectContractWithFieldsSerialization() { diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs index 519bea67..6ac582cf 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ReferenceLoopHandlingTests.cs @@ -152,6 +152,7 @@ namespace Newtonsoft.Json.Tests.Serialization } #if !(PORTABLE || DNXCORE50 || PORTABLE40) || NETSTANDARD1_3 || NETSTANDARD2_0 + [Serializable] public class MainClass : ISerializable { public ChildClass Child { get; set; } @@ -162,6 +163,7 @@ namespace Newtonsoft.Json.Tests.Serialization } } + [Serializable] public class ChildClass : ISerializable { public string Name { get; set; } diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableTestObject.cs b/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableTestObject.cs index 44a97883..2269856f 100644 --- a/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableTestObject.cs +++ b/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableTestObject.cs @@ -29,6 +29,7 @@ using Newtonsoft.Json.Tests.TestObjects.Organization; namespace Newtonsoft.Json.Tests.TestObjects { + [Serializable] public class ISerializableTestObject : ISerializable { internal string _stringValue; diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableWithoutAttributeTestObject.cs b/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableWithoutAttributeTestObject.cs new file mode 100644 index 00000000..2a0b3d8c --- /dev/null +++ b/Src/Newtonsoft.Json.Tests/TestObjects/ISerializableWithoutAttributeTestObject.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.Serialization; + +namespace Newtonsoft.Json.Tests.TestObjects +{ + public class ISerializableWithoutAttributeTestObject : ISerializable + { + public void GetObjectData(SerializationInfo info, StreamingContext context) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/PreserveReferencesCallbackTestObject.cs b/Src/Newtonsoft.Json.Tests/TestObjects/PreserveReferencesCallbackTestObject.cs index eb0fda26..c25c9adf 100644 --- a/Src/Newtonsoft.Json.Tests/TestObjects/PreserveReferencesCallbackTestObject.cs +++ b/Src/Newtonsoft.Json.Tests/TestObjects/PreserveReferencesCallbackTestObject.cs @@ -23,11 +23,13 @@ // OTHER DEALINGS IN THE SOFTWARE. #endregion +using System; using System.Runtime.Serialization; namespace Newtonsoft.Json.Tests.TestObjects { #if !(PORTABLE || PORTABLE40 || DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 + [Serializable] public class PreserveReferencesCallbackTestObject : ISerializable { internal string _stringValue; diff --git a/Src/Newtonsoft.Json.Tests/TestObjects/Ratio.cs b/Src/Newtonsoft.Json.Tests/TestObjects/Ratio.cs index 22599ed7..87e1d01b 100644 --- a/Src/Newtonsoft.Json.Tests/TestObjects/Ratio.cs +++ b/Src/Newtonsoft.Json.Tests/TestObjects/Ratio.cs @@ -30,6 +30,7 @@ using System.Runtime.Serialization; namespace Newtonsoft.Json.Tests.TestObjects { #if !(DNXCORE50) || NETSTANDARD1_3 || NETSTANDARD2_0 + [Serializable] public struct Ratio : IConvertible, IFormattable, ISerializable { private readonly int _numerator; diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs index 053468a2..ff2708ae 100644 --- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs +++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs @@ -1171,7 +1171,7 @@ namespace Newtonsoft.Json.Serialization } #if HAVE_BINARY_SERIALIZATION - if (!IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(t)) + if (!IgnoreSerializableInterface && typeof(ISerializable).IsAssignableFrom(t) && JsonTypeReflector.IsSerializable(t)) { return CreateISerializableContract(objectType); } diff --git a/Src/Newtonsoft.Json/Serialization/JsonTypeReflector.cs b/Src/Newtonsoft.Json/Serialization/JsonTypeReflector.cs index 4ed15c01..a16c534a 100644 --- a/Src/Newtonsoft.Json/Serialization/JsonTypeReflector.cs +++ b/Src/Newtonsoft.Json/Serialization/JsonTypeReflector.cs @@ -383,7 +383,8 @@ namespace Newtonsoft.Json.Serialization public static bool IsNonSerializable(object provider) { #if HAVE_FULL_REFLECTION - return (GetCachedAttribute(provider) != null); + // no inheritance + return (ReflectionUtils.GetAttribute(provider, false) != null); #else FieldInfo fieldInfo = provider as FieldInfo; if (fieldInfo != null && (fieldInfo.Attributes & FieldAttributes.NotSerialized) == FieldAttributes.NotSerialized) @@ -400,7 +401,8 @@ namespace Newtonsoft.Json.Serialization public static bool IsSerializable(object provider) { #if HAVE_FULL_REFLECTION - return (GetCachedAttribute(provider) != null); + // no inheritance + return (ReflectionUtils.GetAttribute(provider, false) != null); #else Type type = provider as Type; if (type != null && (type.GetTypeInfo().Attributes & TypeAttributes.Serializable) == TypeAttributes.Serializable)