我想Exception
使用自定义解析器序列化。
这是一个示例自定义解析器-应该只序列化指定的属性:
public class IncludeSpecifiedPropsResolver : DefaultContractResolver
{
string[] propsToSerialize = null;
public IncludeSpecifiedPropsResolver(params string[] propsToSerialize)
{
this.propsToSerialize = propsToSerialize;
}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
var allProps = base.CreateProperties(type, memberSerialization);
if (propsToSerialize == null || propsToSerialize.Length == 0)
{
return allProps;
}
return allProps.Where(p => propsToSerialize.Contains(p.PropertyName)).ToList();
}
}
用法示例:
string test = JsonConvert.SerializeObject(new Exception("Something went wrong"), new JsonSerializerSettings()
{
ContractResolver = new IncludeSpecifiedPropsResolver("Message")
});
但是,CreateProperties
被忽略了。
还缺少什么,以便自定义解析器可以按预期工作?
这里的问题是Exception
实现ISerializable
接口,该接口在中有特殊处理DefaultContractResolver
:代码路径不经过CreateProperties()
。您可以通过在解析程序的构造函数中将IgnoreSerializableInterface
属性设置为来覆盖此行为true
。如果这样做,您的代码将按预期工作。
public IncludeSpecifiedPropsResolver(params string[] propsToSerialize)
{
this.propsToSerialize = propsToSerialize;
IgnoreSerializableInterface = true;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句