JSON Désérialisation avec un tableau d'objets polymorphes

Je vais avoir un problème avec JSON Désérialisation impliquant un tableau d'objets polymorphes. J'ai essayé les solutions pour la sérialisation documenté ici et ici qui travaillent beaucoup pour la sérialisation, mais à la fois coup sur la désérialisation.

Ma classe, la structure est comme suit:

IDable

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

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

Groupe D'Observation Des

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

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

    [DataMember]
    public List<Observation> Observations { get; set; }

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

    public ObservationGroup()  {
        init();
    }

    private void init()
    {
        Observations = new List<Observation>();
        ObservationRecords = new List<ObservationRecord>();
    }

}

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;
    }
}

Je suis impartial à l'aide de la construite en JavaScriptSerializer ou la Newtonsoft librairie JSON.

Code De Sérialisation

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

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

Désérialisation Code

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

L'erreur que je reçois est

"Impossible de créer une instance de type ProjectXCommon.Les banques de données.De l'Observation. Le Type est une interface ou une classe abstraite et ne peut pas être instantated."

Toute aide serait grandement appréciée!

  • Je suis assez sûr que c'est lié à votre List<Observation> la deserializers essaie d'instancier un type de Observation pas le type qu'il est réellement. Avec Newtonsoft vous pouvez remplacer les pièces de la désérialisation, en ajoutant votre propre Convertisseur (voici un exemple gist.github.com/1140171 ) je ne suis pas sûr de combien cela va vous aider mais comme je suis pas tout à fait certain, mais assez certain que c'est le cas. 🙂
  • json échantillons serait utile
InformationsquelleAutor Chainlink | 2011-08-17