尝试序列化异常时,将忽略自定义解析器

时间:2019-06-18 14:28:08

标签: c# serialization json.net

我想使用自定义解析器序列化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被忽略。

缺少什么,以便自定义解析器可以按预期工作?

1 个答案:

答案 0 :(得分:1)

这里的问题是Exception实现了ISerializable接口,该接口在DefaultContractResolver中有特殊处理:代码路径不经过CreateProperties()。您可以通过在解析器的构造函数中将IgnoreSerializableInterface属性设置为true来覆盖此行为。如果这样做,您的代码将按预期工作。

public IncludeSpecifiedPropsResolver(params string[] propsToSerialize)
{
    this.propsToSerialize = propsToSerialize;
    IgnoreSerializableInterface = true;
}

正在运行的演示:https://dotnetfiddle.net/DNhwaH