为什么net35和net40 NewtonSoft Json库之间存在不同的行为

时间:2016-11-20 12:38:09

标签: c# json json.net

最近我在net35和net40 NewtonSoft Json库之间发现了令人讨厌的不同行为。对于net40,序列化的有效负载是好的。但是对于net35,序列化的有效载荷包括恼人的值k__BackingField。

以下是重现此问题的示例代码:

// Notice that there is no serializable attribute
public class SamplePayload
{
    public Guid Id { get; set; }
}

static void Main(string[] args)
{
    var writeStream = new MemoryStream();
    var formatter = new JsonMediaTypeFormatter();
    formatter.WriteToStreamAsync(typeof(SamplePayload), new SamplePayload(), writeStream, null, null).Wait();
    Console.WriteLine(System.Text.Encoding.UTF8.GetString(writeStream.ToArray()));
}

如果引用net40 / net45 Json库,则序列化的有效负载类似于预期的“Id”。但是对于net35库,序列化的有效负载包括“k__BackingField”。

我想知道为什么会出现这样的行为差异?它是NewtonSoft Json库中的缺陷还是设计行为?如果是后者,那么避免此类问题的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

.NET 3.5已经很老了,设计AFAIK就是k__BackingField。摆脱它是well-documented。您需要检查版本以及何时包含该字段,请应用此处链接的解决方案。