From bbe7eaf852b41ecdfb4817b9bd2f1fc9432abc1a Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Sat, 21 Jun 2014 19:59:17 +1200 Subject: [PATCH] -Fixed serializing static fields --- .../Serialization/JsonSerializerTest.cs | 33 +++++++++++++++++++ .../DynamicReflectionDelegateFactory.cs | 15 +++++++-- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs index 5853d2bd..f9aa727f 100644 --- a/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs +++ b/Src/Newtonsoft.Json.Tests/Serialization/JsonSerializerTest.cs @@ -5806,6 +5806,29 @@ To fix this error either change the environment to be fully trusted, change the } } + [Test] + public void SerializeStaticField() + { + StaticFieldTestClass c = new StaticFieldTestClass + { + x = int.MaxValue + }; + string json = JsonConvert.SerializeObject(c, Formatting.Indented); + + Assert.AreEqual(@"{ + ""x"": 2147483647, + ""y"": 2 +}", json); + + StaticFieldTestClass c2 = JsonConvert.DeserializeObject(@"{ + ""x"": -1, + ""y"": -2 +}"); + + Assert.AreEqual(-1, c2.x); + Assert.AreEqual(-2, StaticFieldTestClass.y); + } + #if !(NET20 || NETFX_CORE) [Test] public void DeserializeDecimalsWithCulture() @@ -8126,4 +8149,14 @@ Parameter name: value", public double Height { get; set; } public decimal Price { get; set; } } + + [JsonObject(MemberSerialization.OptIn)] + public class StaticFieldTestClass + { + [JsonProperty] + public int x = 1; + + [JsonProperty] + public static int y = 2; + } } \ No newline at end of file diff --git a/Src/Newtonsoft.Json/Utilities/DynamicReflectionDelegateFactory.cs b/Src/Newtonsoft.Json/Utilities/DynamicReflectionDelegateFactory.cs index e6e6a34f..fc5cd25c 100644 --- a/Src/Newtonsoft.Json/Utilities/DynamicReflectionDelegateFactory.cs +++ b/Src/Newtonsoft.Json/Utilities/DynamicReflectionDelegateFactory.cs @@ -221,9 +221,15 @@ namespace Newtonsoft.Json.Utilities private void GenerateCreateGetFieldIL(FieldInfo fieldInfo, ILGenerator generator) { if (!fieldInfo.IsStatic) + { generator.PushInstance(fieldInfo.DeclaringType); + generator.Emit(OpCodes.Ldfld, fieldInfo); + } + else + { + generator.Emit(OpCodes.Ldsfld, fieldInfo); + } - generator.Emit(OpCodes.Ldfld, fieldInfo); generator.BoxIfNeeded(fieldInfo.FieldType); generator.Return(); } @@ -245,7 +251,12 @@ namespace Newtonsoft.Json.Utilities generator.Emit(OpCodes.Ldarg_1); generator.UnboxIfNeeded(fieldInfo.FieldType); - generator.Emit(OpCodes.Stfld, fieldInfo); + + if (!fieldInfo.IsStatic) + generator.Emit(OpCodes.Stfld, fieldInfo); + else + generator.Emit(OpCodes.Stsfld, fieldInfo); + generator.Return(); }