我有一个场景,其类定义如下:
class MyObject
{
public DataDictionary MyObjectData { get; set; }
public bool ShouldSerializeMyObjectData() { return true; }
public bool ShouldDeserializeMyObjectData() { return false; }
}
当我尝试使用JSON.net对该类进行序列化/反序列化时,它会考虑ShouldSerialize,而不是ShouldDeserialize。
根据文档,两者应该以我猜的相同方式工作。有什么特别的我应该知道的吗?更一般而言,我应该如何处理要序列化属性但不反序列化它的方案?
我正在使用,Json.NET 8.0
如果那很重要。
谢谢你的帮助。
对于您的问题的简短回答是,即使是自动检查,ShouldDeserialize{PropertyName}()
当前也未实现ShouldSerialize{PropertyName}()
。接下来是更长的答案和解决方法。
JsonProperty
Json.NET在内部使用该类来定义有关如何将JSON属性映射到.NET成员或构造函数参数的协定。它具有两个谓词属性,ShouldSerialize
并且ShouldDeserialize
当它们为非null时,分别防止该属性被序列化和反序列化。初始化每个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; }
}
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;
}
}
如果您想有条件地禁止属性反序列化(即使存在于JSON中),则可以考虑使用(和缓存)此协定解析器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句