Разница между свойствами конвертера и MemberConverter Json.NET JsonProperty

Класс JsonProperty, возвращаемый DefaultContractResolver.CreateProperty, имеет два свойства относительно преобразователя, Converter и MemberConverter. Я не нахожу достаточного объяснения о них, так какая разница между ними? Когда использовать каждый? Какую собственность установить в разрешении? "Получить или установить конвертер элементов" из официальной документации не помогает.

Ответ 1

Казалось бы, NS.Json поддерживает overridable converters; предположительно это так, что каждому отдельному свойству не нужно указывать JsonConverter, но при необходимости он может переопределить его.

Подсказки можно найти в источнике:

От DefaultContractResolver.cs, строка 1254:

private void SetPropertySettingsFromAttributes(JsonProperty property, object attributeProvider, string name, Type declaringType, MemberSerialization memberSerialization, out bool allowNonPublicAccess)
{
    ...
    // resolve converter for property
    // the class type might have a converter but the property converter takes presidence
    property.Converter = JsonTypeReflector.GetJsonConverter(attributeProvider);
    property.MemberConverter = JsonTypeReflector.GetJsonConverter(attributeProvider);

И из JsonSerializerInternalReader.cs, строка 348:

    private JsonConverter GetConverter(JsonContract contract, JsonConverter memberConverter, JsonContainerContract containerContract, JsonProperty containerProperty)
    {
        JsonConverter converter = null;
        if (memberConverter != null)
        {
            // member attribute converter
            converter = memberConverter;
        }
        else if (containerProperty != null && containerProperty.ItemConverter != null)
        {
            converter = containerProperty.ItemConverter;
        }
        else if (containerContract != null && containerContract.ItemConverter != null)
        {
            converter = containerContract.ItemConverter;
        }
        else if (contract != null)
        {
            JsonConverter matchingConverter;
            if (contract.Converter != null)
                // class attribute converter
                converter = contract.Converter;
            else if ((matchingConverter = Serializer.GetMatchingConverter(contract.UnderlyingType)) != null)
                // passed in converters
                converter = matchingConverter;
            else if (contract.InternalConverter != null)
                // internally specified converter
                converter = contract.InternalConverter;
        }
        return converter;
    }

Ответ 2

Я открыл проблему с документами здесь github.com/JamesNK/Newtonsoft.Json/issues/363.

Но одно очевидное различие между ними (очевидно, из исходного кода) заключается в том, что Конвертер используется только при сериализации и MemberConverter только при десериализации. Я не знаю, если это полная история, хотя и именование действительно говорит много.