升级NewtonSoft JSON.NET不会隐式序列化受保护的成员

dag*_*da1 4 c# json.net

我刚刚将我的NewtonSoft JSON.NET版本从3.0.0更新到3.5.0,我注意到受保护的成员不是隐式序列化的.

我有以下课程:

public class SimpleFileContainer : IDto
{
    public virtual string Name { get; protected set; }

    public virtual string Path { get; protected set; }

    public SimpleFileContainer(string name, string path)
    {
        Name = name;
        Path = path;
    }
}
Run Code Online (Sandbox Code Playgroud)

以下测试代码未通过

var json = JsonConvert.SerializeObject(new SimpleFileContainer("Name", "Path"));

var deserialised = JsonConvert.DeserializeObject<SimpleFileContainer >(json);

Assert.That(deserialised.Name, Is.EqualTo("Name");
Run Code Online (Sandbox Code Playgroud)

除非我将属性设置为public或添加更新具有以下属性的类,否则Name和Path属性都为null:

[JsonObject(MemberSerialization.OptOut)]
public class SimpleFileContainer : IDto
{
    [JsonProperty]
    public virtual string Name { get; protected set; }

    [JsonProperty]
    public virtual string Path { get; protected set; }

    public SimpleFileContainer(string name, string path)
    {
        Name = name;
        Path = path;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个使用序列化过程的合理大小的项目,我不想通过代码将这些属性添加到每个类和成员.

这有什么方法吗?

Joã*_*nça 7

我今天遇到了同样的问题.幸运的是Ayende得到了解决方案,我正在和你分享.配置序列化程序时,更改ContractResolver上的DefaultMembersSearchFlags属性:

var serializer = new JsonSerializer
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
                            ContractResolver = new DefaultContractResolver
                                {
                                    DefaultMembersSearchFlags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
                                },
                            TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,

                            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
                        };
Run Code Online (Sandbox Code Playgroud)

  • 此设置还序列化字段.不仅属性. (2认同)