-Added SerializeCompilerGeneratedMembers to DefaultContractResolver to control serializing compiler generated fields
This commit is contained in:
@@ -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,
|
||||
""<StringProperty>k__BackingField"": ""Property"",
|
||||
""<IntProperty>k__BackingField"": 2,
|
||||
""StringProperty"": ""Property"",
|
||||
""IntProperty"": 2
|
||||
}", includeCompilerGeneratedJson);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
/// <value>The default members search flags.</value>
|
||||
public BindingFlags DefaultMembersSearchFlags { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets a value indicating whether compiler generated members should be serialized.
|
||||
/// </summary>
|
||||
/// <value>
|
||||
/// <c>true</c> if serialized compiler generated members; otherwise, <c>false</c>.
|
||||
/// </value>
|
||||
public bool SerializeCompilerGeneratedMembers { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DefaultContractResolver"/> class.
|
||||
/// </summary>
|
||||
@@ -205,20 +214,24 @@ namespace Newtonsoft.Json.Serialization
|
||||
List<MemberInfo> serializableMembers = new List<MemberInfo>();
|
||||
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<JsonPropertyAttribute>(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<JsonPropertyAttribute>(member) != null)
|
||||
serializableMembers.Add(member);
|
||||
#if !PocketPC && !NET20
|
||||
else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute<DataMemberAttribute>(member) != null)
|
||||
serializableMembers.Add(member);
|
||||
else if (dataContractAttribute != null && JsonTypeReflector.GetAttribute<DataMemberAttribute>(member) != null)
|
||||
serializableMembers.Add(member);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user