我想使用自定义解析器序列化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
被忽略。
缺少什么,以便自定义解析器可以按预期工作?
答案 0 :(得分:1)
这里的问题是Exception
实现了ISerializable
接口,该接口在DefaultContractResolver
中有特殊处理:代码路径不经过CreateProperties()
。您可以通过在解析器的构造函数中将IgnoreSerializableInterface
属性设置为true
来覆盖此行为。如果这样做,您的代码将按预期工作。
public IncludeSpecifiedPropsResolver(params string[] propsToSerialize)
{
this.propsToSerialize = propsToSerialize;
IgnoreSerializableInterface = true;
}
正在运行的演示:https://dotnetfiddle.net/DNhwaH