Пользовательский распознаватель игнорируется при попытке сериализации исключения - PullRequest
2 голосов
/ 18 июня 2019

Я бы хотел сериализовать 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 Ответ

1 голос
/ 18 июня 2019

Проблема здесь в том, что Exception реализует интерфейс ISerializable, который имеет специальную обработку в DefaultContractResolver: путь к коду не проходит через CreateProperties().Вы можете переопределить это поведение, установив для свойства IgnoreSerializableInterface значение true в конструкторе вашего преобразователя.Если вы сделаете это, ваш код будет работать так, как задумано.

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

Рабочая демонстрация: https://dotnetfiddle.net/DNhwaH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...