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

时间:2010-06-22 10:42:05

标签: 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;
    }
}

以下测试代码未通过

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

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

Assert.That(deserialised.Name, Is.EqualTo("Name");

除非我将属性设置为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;
    }
}

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

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分: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
                        };