以下类将往返(序列化为字符串,然后反序列化为对象)就好了:
public class FoobarObject
{
public readonly IFileLocation File1;
public readonly IFileLocation File2;
public readonly IFileLocation File3;
public FoobarObject(IFileLocation file1, IFileLocation file2, IFileLocation file3)
{
File1 = file1;
File2 = file2;
File3 = file3;
}
}
但是,如果我将其更改为以下内容,则会失败(字段将返回为null
):
public class FoobarObject
{
//[JsonProperty("SomeFile1")]
public readonly IFileLocation SomeFile1;
public readonly IFileLocation File2;
public readonly IFileLocation File3;
public FoobarObject(IFileLocation file1, IFileLocation file2, IFileLocation file3)
{
SomeFile1 = file1;
File2 = file2;
File3 = file3;
}
}
但是,通过取消注释JsonProperty
行,该对象将正确地进行往返。
序列化字符串似乎是正确的("{\"SomeFile1\":\"C:\\\\vibwd541.u2q\\\\Foobar1\", \"File2\":\"C:\\\\vibwd541.u2q\\\\Foobar2\", \"File3\":null}"
,但反序列化不会发生。
发生了什么事?
答案 0 :(得分:2)
发生这种情况的原因是,默认情况下,Json.NET使用ConstructorHandling.Default算法来确定反序列化类型时要使用的构造函数。根据{{3}}:
,此算法的工作原理如下ConstructorHandling Enumeration
Default First attempt to use the public default constructor, then fall back to single paramatized constructor, then the non-public default constructor. AllowNonPublicDefaultConstructor Json.NET will use a non-public default constructor before falling back to a paramatized constructor.
您的班级有一个公共构造函数。它有三个参数IFileLocation file1, IFileLocation file2, IFileLocation file3
。因此,Json.NET将在反序列化期间使用它构建对象docs。因此,如果在序列化期间将File1
重命名为SomeFile1
,它将不再与任何构造函数参数的名称匹配,也不会反序列化。
要避免此问题,请确保属性名称与构造函数参数名称匹配。