-Fixed serializing static fields

This commit is contained in:
James Newton-King
2014-06-21 19:59:17 +12:00
parent c545dc3f43
commit bbe7eaf852
2 changed files with 46 additions and 2 deletions
@@ -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<StaticFieldTestClass>(@"{
""x"": -1,
""y"": -2
}");
Assert.AreEqual(-1, c2.x);
Assert.AreEqual(-2, StaticFieldTestClass.y);
}
#if !(NET20 || NETFX_CORE) #if !(NET20 || NETFX_CORE)
[Test] [Test]
public void DeserializeDecimalsWithCulture() public void DeserializeDecimalsWithCulture()
@@ -8126,4 +8149,14 @@ Parameter name: value",
public double Height { get; set; } public double Height { get; set; }
public decimal Price { get; set; } public decimal Price { get; set; }
} }
[JsonObject(MemberSerialization.OptIn)]
public class StaticFieldTestClass
{
[JsonProperty]
public int x = 1;
[JsonProperty]
public static int y = 2;
}
} }
@@ -221,9 +221,15 @@ namespace Newtonsoft.Json.Utilities
private void GenerateCreateGetFieldIL(FieldInfo fieldInfo, ILGenerator generator) private void GenerateCreateGetFieldIL(FieldInfo fieldInfo, ILGenerator generator)
{ {
if (!fieldInfo.IsStatic) if (!fieldInfo.IsStatic)
{
generator.PushInstance(fieldInfo.DeclaringType); 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.BoxIfNeeded(fieldInfo.FieldType);
generator.Return(); generator.Return();
} }
@@ -245,7 +251,12 @@ namespace Newtonsoft.Json.Utilities
generator.Emit(OpCodes.Ldarg_1); generator.Emit(OpCodes.Ldarg_1);
generator.UnboxIfNeeded(fieldInfo.FieldType); 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(); generator.Return();
} }