我有一个类定义如下的场景:
class MyObject
{
public DataDictionary MyObjectData { get; set; }
public bool ShouldSerializeMyObjectData() { return true; }
public bool ShouldDeserializeMyObjectData() { return false; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用JSON.net序列化/反序列化该类时,它会考虑ShouldSerialize,但不会考虑ShouldDeserialize.
根据文档,两者都应该像我猜的那样工作.有什么特别值得我知道的吗?更一般地说,我应该如何处理我想要序列化属性但不反序列化它的场景?
我正在使用,Json.NET 8.0如果这很重要.
谢谢你的帮助.
dbc*_*dbc 10
对你的问题的简短回答是,即使是现在也没有自动检查.ShouldDeserialize{PropertyName}()ShouldSerialize{PropertyName}() 更长的答案和解决方法如下.
该类JsonProperty由Json.NET在内部用于定义如何将JSON属性映射到.NET成员或构造函数参数的合同.它有两个谓词属性,ShouldSerialize并且ShouldDeserialize,当非空,防止财产被序列化和反序列化,分别.初始化每个JsonProperty是工作ContractResolver.对于每个属性{PropertyName},Json.NET的默认合同解析程序会自动检查public bool ShouldSerialize{PropertyName}()方法是否存在.如果存在这样的方法,它会在ShouldSerialize谓词中添加对它的调用,从而在方法返回时抑制序列化false.这是因为通过方法控制属性序列化ShouldSerialize{PropertyName}()是由例如支持的标准模式XmlSerializer.有关更多背景信息,请参阅相关的Json.NET发行说明.
例如,在以下类中,MyObjectData将禁止序列化,除非MyObjectData.Count > 0:
class MyObject
{
public DataDictionary MyObjectData { get; set; }
public bool ShouldSerializeMyObjectData() { return MyObjectData != null && MyObjectData.Count > 0; }
}
Run Code Online (Sandbox Code Playgroud)
JsonProperty.ShouldDeserialize但是,它永远不会被默认的合约解析程序设置.这可能是由于没有标准的反序列化模式等同于此ShouldSerialize{PropertyName}(),因此Newtonsoft从未有过实现这种模式的请求.然而,正如您所注意到的,存在支持这种模式的基础架构,因此应用程序可以创建自定义合同解析器.事实上,Json.NET在自己的测试套件中有一个这样的合同解析器的例子:
public class ShouldDeserializeContractResolver : DefaultContractResolver
{
public static new readonly ShouldDeserializeContractResolver Instance = new ShouldDeserializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
MethodInfo shouldDeserializeMethodInfo = member.DeclaringType.GetMethod("ShouldDeserialize" + member.Name);
if (shouldDeserializeMethodInfo != null)
{
property.ShouldDeserialize = o => { return (bool)shouldDeserializeMethodInfo.Invoke(o, null); };
}
return property;
}
}
public class ShouldDeserializeTestClass
{
[JsonExtensionData]
public IDictionary<string, JToken> ExtensionData { get; set; }
public bool HasName { get; set; }
public string Name { get; set; }
public bool ShouldDeserializeName()
{
return HasName;
}
}
Run Code Online (Sandbox Code Playgroud)
如果要有条件地抑制属性的反序列化,即使存在于JSON中,也可以考虑使用(和缓存)此合约解析程序.
| 归档时间: |
|
| 查看次数: |
6387 次 |
| 最近记录: |