From 1c018e7a09fcb1fa8dede5a6267d5595b15adb6c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sun, 16 Mar 2014 13:09:34 +1300 Subject: [PATCH] -Fixed non-public base class properties being used instead of child class properties --- .../Linq/JsonPath/JPathExecuteTests.cs | 6 +-- .../Properties/AssemblyInfo.cs | 2 +- .../Serialization/JsonSerializerTest.cs | 38 +++++++++++++++++++ .../Properties/AssemblyInfo.cs | 2 +- .../Utilities/ReflectionUtils.cs | 13 +++++-- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs index 7d914237..510a75f3 100644 --- a/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs +++ b/Src/Newtonsoft.Json.Tests/Linq/JsonPath/JPathExecuteTests.cs @@ -435,8 +435,8 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath [Test] public void EvaluateScan() { - JObject o1 = new JObject{ {"Name", 1} }; - JObject o2 = new JObject{ {"Name", 2} }; + JObject o1 = new JObject { { "Name", 1 } }; + JObject o2 = new JObject { { "Name", 2 } }; JArray a = new JArray(o1, o2); IList t = a.SelectTokens("$..Name").ToList(); @@ -655,7 +655,7 @@ namespace Newtonsoft.Json.Tests.Linq.JsonPath new JProperty("name", "The Rock"), new JProperty("cast", new JArray( new JObject(new JProperty("name", "Nick Cage"))))) - ); + ); IList t = a.SelectTokens("[?(@.cast[?(@.name=='Will Smith')])].name").ToList(); Assert.IsNotNull(t); diff --git a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs index 2327e9ff..358c23ba 100644 --- a/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json.Tests/Properties/AssemblyInfo.cs @@ -75,4 +75,4 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.1.17109")] +[assembly: AssemblyFileVersion("6.0.1.17115")] diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 9580a6f5..f7c4a7de 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -268,6 +268,44 @@ namespace Newtonsoft.Json.Tests.Serialization Assert.IsTrue(JToken.DeepEquals(c.ExtensionData, c2.ExtensionData)); } + public class BaseClass + { + internal bool IsTransient { get; set; } + } + + public class ChildClass : BaseClass + { + public new bool IsTransient { get; set; } + } + + [Test] + public void NewProperty() + { + Assert.AreEqual(@"{""IsTransient"":true}", JsonConvert.SerializeObject(new ChildClass { IsTransient = true })); + + var childClass = JsonConvert.DeserializeObject(@"{""IsTransient"":true}"); + Assert.AreEqual(true, childClass.IsTransient); + } + + public class BaseClassVirtual + { + internal virtual bool IsTransient { get; set; } + } + + public class ChildClassVirtual : BaseClassVirtual + { + public virtual new bool IsTransient { get; set; } + } + + [Test] + public void NewPropertyVirtual() + { + Assert.AreEqual(@"{""IsTransient"":true}", JsonConvert.SerializeObject(new ChildClassVirtual { IsTransient = true })); + + var childClass = JsonConvert.DeserializeObject(@"{""IsTransient"":true}"); + Assert.AreEqual(true, childClass.IsTransient); + } + [Test] public void JsonSerializerProperties() { diff --git a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs index 9c17f1b5..28da5a13 100644 --- a/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs +++ b/Src/Newtonsoft.Json/Properties/AssemblyInfo.cs @@ -91,5 +91,5 @@ using System.Security; // by using the '*' as shown below: [assembly: AssemblyVersion("6.0.0.0")] -[assembly: AssemblyFileVersion("6.0.1.17109")] +[assembly: AssemblyFileVersion("6.0.1.17115")] [assembly: CLSCompliant(true)] diff --git a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs index c99c48f4..28b9dddd 100644 --- a/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs +++ b/Src/Newtonsoft.Json/Utilities/ReflectionUtils.cs @@ -856,10 +856,15 @@ namespace Newtonsoft.Json.Utilities } else { - // replace nonpublic properties for a child, but gotten from - // the parent with the one from the child - // the property gotten from the child will have access to private getter/setter - initialProperties[index] = subTypeProperty; + PropertyInfo childProperty = initialProperties[index]; + // don't replace public child with private base + if (!IsPublic(childProperty)) + { + // replace nonpublic properties for a child, but gotten from + // the parent with the one from the child + // the property gotten from the child will have access to private getter/setter + initialProperties[index] = subTypeProperty; + } } } else