4

我刚刚将我的 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");

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;
    }
}

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

有办法解决这个问题吗?

4

1 回答 1

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
                        };
于 2010-08-06T23:58:22.003 回答