Десериализация JSON с массивом полиморфных объектов

У меня проблема с десериализацией JSON, включающей массив полиморфных объектов. Я пробовал решения для сериализации, описанные здесь и здесь , которые отлично работают для сериализации, но оба взрываются при десериализации.

Моя структура классов следующая:

IDable

[DataContract(IsReference=true)]
public abstract class IDable {

    [DataMember]
    public T ID { get; set; }
}

Группа наблюдений

[DataContract(IsReference=true)]
[KnownType(typeof(DescriptiveObservation))]
[KnownType(typeof(NoteObservation))]
[KnownType(typeof(NumericObservation))]
[KnownType(typeof(ScoredObservation))]
public class ObservationGroup : IDable {

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public List Observations { get; set; }

    [OnDeserializing]
    void OnDeserializing(StreamingContext context)
    {
        init();
    }

    public ObservationGroup()  {
        init();
    }

    private void init()
    {
        Observations = new List();
        ObservationRecords = new List();
    }

}

DescriptiveObservation

[DataContract(IsReference = true)]
public class DescriptiveObservation : Observation
{

    protected override ObservationType GetObservationType()
    {
        return ObservationType.Descriptive;
    }
}

NoteObservation

[DataContract(IsReference = true)]
public class NoteObservation : Observation
{
    protected override ObservationType GetObservationType()
    {
        return ObservationType.Note;
    }
}

NumericObservation

[DataContract(IsReference = true)]
public class NumericObservation : Observation
{
    [DataMember]
    public double ConstraintMaximum { get; set; }
    [DataMember]
    public double ConstraintMinimum { get; set; }
    [DataMember]
    public int PrecisionMaximum { get; set; }
    [DataMember]
    public int PrecisionMinimum { get; set; }
    [DataMember]
    public string UnitType { get; set; }

    protected override ObservationType GetObservationType()
    {
        return ObservationType.Numeric;
    }
}

ScoredObservation

[DataContract(IsReference = true)]
public class ScoredObservation : Observation {
    [DataMember]
    public int Value { get; set; }

    protected override ObservationType GetObservationType() {
        return ObservationType.Scored;
    }
}

Я беспристрастно использую встроенный JavaScriptSerializer или библиотека Newtonsoft JSON.

Код сериализации

var settings = new Newtonsoft.Json.JsonSerializerSettings();
settings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Objects;

Newtonsoft.Json.JsonConvert.SerializeObject(AnInitializedScoresheet, Newtonsoft.Json.Formatting.None, settings);

Код десериализации

return Newtonsoft.Json.JsonConvert.DeserializeObject(returnedStringFromClient, typeof(Scoresheet));
//Scoresheet contains a list of observationgroups

Я получаю ошибку

«Не удалось создать экземпляр типа ProjectXCommon.DataStores.Observation. Тип является интерфейсом или абстрактным классом и не может быть мгновенным. "

Любая помощь будет принята с благодарностью!

26
задан Community 23 May 2017 в 12:07
поделиться