From c8fa450bed65091f6c15eadce5d74d6e4dd4d89b Mon Sep 17 00:00:00 2001 From: JamesNK Date: Mon, 9 Aug 2010 10:59:35 +0000 Subject: [PATCH] -Added SerializeCompilerGeneratedMembers to DefaultContractResolver to control serializing compiler generated fields --- .../Serialization/ContractResolverTests.cs | 47 +++++++++++++++++++ .../Serialization/DefaultContractResolver.cs | 33 +++++++++---- 2 files changed, 70 insertions(+), 10 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs index 754f941a..24221cb3 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/ContractResolverTests.cs @@ -4,6 +4,8 @@ using System.Linq; using System.Text; using NUnit.Framework; using Newtonsoft.Json.Serialization; +using Newtonsoft.Json.Tests.TestObjects; +using System.Reflection; namespace Newtonsoft.Json.Tests.Serialization { @@ -79,5 +81,50 @@ namespace Newtonsoft.Json.Tests.Serialization ""BookPrice"": 16.19 }", startingWithB); } + + [Test] + public void SerializeCompilerGeneratedMembers() + { + StructTest structTest = new StructTest + { + IntField = 1, + IntProperty = 2, + StringField = "Field", + StringProperty = "Property" + }; + + DefaultContractResolver skipCompilerGeneratedResolver = new DefaultContractResolver + { + DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public + }; + + string skipCompilerGeneratedJson = JsonConvert.SerializeObject(structTest, Formatting.Indented, + new JsonSerializerSettings { ContractResolver = skipCompilerGeneratedResolver }); + + Assert.AreEqual(@"{ + ""StringField"": ""Field"", + ""IntField"": 1, + ""StringProperty"": ""Property"", + ""IntProperty"": 2 +}", skipCompilerGeneratedJson); + + DefaultContractResolver includeCompilerGeneratedResolver = new DefaultContractResolver + { + DefaultMembersSearchFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, + SerializeCompilerGeneratedMembers = true + }; + + string includeCompilerGeneratedJson = JsonConvert.SerializeObject(structTest, Formatting.Indented, + new JsonSerializerSettings { ContractResolver = includeCompilerGeneratedResolver }); + + Assert.AreEqual(@"{ + ""StringField"": ""Field"", + ""IntField"": 1, + ""k__BackingField"": ""Property"", + ""k__BackingField"": 2, + ""StringProperty"": ""Property"", + ""IntProperty"": 2 +}", includeCompilerGeneratedJson); + } } } diff --git a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs index d596101e..6f5adf7b 100644 --- a/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs +++ b/Src/Newtonsoft.Json/Serialization/DefaultContractResolver.cs @@ -35,6 +35,7 @@ using System.Security.Permissions; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Utilities; using Newtonsoft.Json.Linq; +using System.Runtime.CompilerServices; namespace Newtonsoft.Json.Serialization { @@ -113,6 +114,14 @@ namespace Newtonsoft.Json.Serialization /// The default members search flags. public BindingFlags DefaultMembersSearchFlags { get; set; } + /// + /// Gets or sets a value indicating whether compiler generated members should be serialized. + /// + /// + /// true if serialized compiler generated members; otherwise, false. + /// + public bool SerializeCompilerGeneratedMembers { get; set; } + /// /// Initializes a new instance of the class. /// @@ -205,20 +214,24 @@ namespace Newtonsoft.Json.Serialization List serializableMembers = new List(); foreach (MemberInfo member in allMembers) { - if (defaultMembers.Contains(member)) + // exclude members that are compiler generated if set + if (SerializeCompilerGeneratedMembers || !member.IsDefined(typeof(CompilerGeneratedAttribute), true)) { - // add all members that are found by default member search - serializableMembers.Add(member); - } - else - { - // add members that are explicitly marked with JsonProperty/DataMember attribute - if (JsonTypeReflector.GetAttribute(member) != null) + if (defaultMembers.Contains(member)) + { + // add all members that are found by default member search serializableMembers.Add(member); + } + else + { + // add members that are explicitly marked with JsonProperty/DataMember attribute + if (JsonTypeReflector.GetAttribute(member) != null) + serializableMembers.Add(member); #if !PocketPC && !NET20 - else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute(member) != null) - serializableMembers.Add(member); + else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute(member) != null) + serializableMembers.Add(member); #endif + } } }