4

ConcreteCollectionTypeConverter を使用して IList 型のオブジェクトを逆シリアル化しています。「リストをIListに変換できません」という例外が発生し続けるため、おそらく非常に間違っています

私のオブジェクトインターフェイスは次のようになります。

[JsonObject(MemberSerialization.OptIn)]
public IMyInterface {

    [JsonProperty("associatedContact")]
    [JsonConverter(typeof(ConcreteCollectionTypeConverter<IList<ISomeOtherInterface>, List<SomeOtherInterface>>))]
    IList<ISomeOtherInterface> MyObject { get; set; }
}

私のオブジェクトの実装は次のようになります。

public MyImplementation : IMyInterface {

    public List<SomeOtherImplementation> MyObject { get; set; }

    public MyImplementations () {
        MyObject = new List<SomeOtherImplementation>();          
    }
}

私の Json コンバーターは次のようになります。

class ConcreteCollectionTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }

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

次のように、プロジェクトの別の場所で逆シリアル化メソッドを呼び出しています。

var myDeserializedObject = JsonConvert.DeserializeObject<MyImplementation>(jsonObject.ToString());

上記の jsonObject は正しく解析されています。

ここでSOに関するコメントを見たので、これが可能であることを知っています.

このアプローチは、非コレクション アイテムに対してはうまく機能します (つまり、インターフェイス タイプ IIterface MyObject のオブジェクトを JsonConverer(typeof(ConcreteTypeCOnverter)) で逆シリアル化すると機能します)。

IList の代わりに List のみを使用する場合、Type Converter は必要ありませんが、非標準の実装の可能性があるため、ICollection の使用を保証する必要があります。

4

1 に答える 1

3

私はこれがあなたが必要とするもののために働くと信じています:

public class ConcreteListTypeConverter<TInterface, TImplementation> : JsonConverter where TImplementation : TInterface 
{
    public override bool CanConvert(Type objectType)
    {
        return true;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var res = serializer.Deserialize<List<TImplementation>>(reader);
        return res.ConvertAll(x => (TInterface) x);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        serializer.Serialize(writer, value);
    }
}
于 2015-06-10T19:39:02.290 に答える