1

実装タイプを定義せずにJson.NETを使用して保存されたインターフェイスオブジェクトを逆シリアル化すると、(もちろん)エラーがスローされるため、再利用可能なクラスを作成しました。

public class MakeJsonConverter<TParent, TChild> : JsonConverter where TChild:TParent
{
    private readonly Type _parent;
    private Type _child;

    public MakeJsonConverter()
    {
        _parent = typeof(TParent);
        _child = typeof(TChild);
    }

    public override bool CanConvert(Type objectType)
    {
        return (objectType == _parent);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return serializer.Deserialize<TChild>(reader);
    }

    //This should never be called. Only reading from saved interface data was an issue without using a converter.
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

渡した設定が使用されていないように見えることを除いて、正常に動作します。実際、私は確かにそれを知りません、私が知っていることは、MissingMemberHandling.Errorが機能していないということです。

public virtual string SerializeWithConverter<TParent, TChild>(TParent obj) where TChild : TParent
{
    var settings = new JsonSerializerSettings
    {
        ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
        ContractResolver = new DefaultContractResolver
        {
            DefaultMembersSearchFlags =
                BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance
        },
        TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple,
        ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,

        //Settings important to this situation
        MissingMemberHandling = MissingMemberHandling.Error,
        Converters = new List<JsonConverter> { new MakeJsonConverter<TParent, TChild>() }
    };

    return JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
}

なぜこれが今のように機能しているのか理解できないようです..誰かが説明できますか?

4

2 に答える 2

0

MissingMemberHandling.Error が機能していないと言うとき、正確にはどういう意味ですか? ユーザーがオブジェクトに一致しないオブジェクトを上/下に投稿すると、エラーが発生することが予想されるためだと思いますか? いずれにせよ、独自のカスタム ContractResolver を設定しても MissingMemberHandling.Error はスローされないと思います。代わりに、DefaultContractResolver から継承する独自のクラスを作成し、JsonObjectContract をオーバーライドします。これにより、期待どおりの結果が得られます。

    public class CustomContractResolver : DefaultContractResolver
    {
        protected override JsonObjectContract CreateObjectContract(Type objectType)
        {
            var contract = base.CreateObjectContract(objectType);
            contract.ItemRequired = Required.Always;
            return contract;
        }
    }

次に、それを契約リゾルバーとして使用します

ContractResolver = new CustomContractResolver(),

テストして私のために働いた

于 2016-02-15T16:26:43.690 に答える