10

によって返されるJsonPropertyクラスには、DefaultContractResolver.CreatePropertyコンバーターに関する 2 つのプロパティがConverterありMemberConverterます。それらについての十分な説明が見つからないので、それらの違いは何ですか? それぞれをいつ使用するのですか?コントラクト リゾルバーに設定するプロパティは? 公式ドキュメントの「メンバーコンバーターを取得または設定する」は役に立ちません。

4

2 に答える 2

3

NS.Json はオーバーライド可能なコンバーターをサポートしているようです。おそらくこれは、個々のプロパティが 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;
    }
于 2014-07-14T20:58:26.423 に答える
2

ここgithub.com/JamesNK/Newtonsoft.Json/issues/363のドキュメントに関する問題を開きました。

ただし、これらの 1 つの明らかな違い (つまり、ソース コードから明らか) は、Converter はシリアライズ時にのみ使用され、MemberConverter はデシリアライズ時にのみ使用されることです。それが完全なストーリーかどうかはわかりませんが、ネーミングはあまり語っていません.

于 2014-09-04T12:53:09.033 に答える