我刚刚将我的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;
}
}
这是一个使用序列化过程的合理大小的项目,我不想通过代码将这些属性添加到每个类和成员。
有没有办法解决这个问题?
答案 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
};