C# Json.Net往返使用PascalCase失败

C# Json.Net往返使用PascalCase失败,c#,json,C#,Json,以下类将进行往返(序列化为字符串,然后反序列化为对象): public class FoobarObject { public readonly IFileLocation File1; public readonly IFileLocation File2; public readonly IFileLocation File3; public FoobarObject(IFileLocation file1, IFileLocation file2, IFi

以下类将进行往返(序列化为字符串,然后反序列化为对象):

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
):

但是,通过取消注释
JsonProperty
行,对象将正确地进行往返

序列化的字符串似乎是正确的(
“{\'SomeFile1\”:\'C:\\\\vibwd541.u2q\\\\Foobar1\”,\'File2\:\'C:\\\\\vibwd541.u2q\\\\Foobar2\,\'File3\':null}
,但未发生反序列化


发生了什么?

发生这种情况的原因是,默认情况下,Json.NET使用该算法确定反序列化类型时要使用的构造函数。根据

构造函数处理枚举

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将在反序列化期间使用它来构造您的对象。因此,如果在序列化期间将
file1
重命名为
SomeFile1
,它将不再与构造函数参数的y,将不会反序列化


要避免此问题,请确保属性名称与构造函数参数名称匹配。

只读
是有罪的。有关详细信息,请访问:
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.