Frage

Nach der MSDN-Referenz lesen, ich habe noch Fragen zu, wenn das Knowntype Attribut zu verwenden. Ich verstehe, dass der Attributtyp Informationen zu dem Serializer in Verbindung steht, aber wenn ist dies erforderlich? Ist es angemessen, wenn die Klasse serialisiert Referenzen eines Basisklassentyp hat ist, und es gibt bis Guss Derivat Klassen, die auf diese Referenzen gesetzt werden könnte?

Darüber hinaus gibt es irgendwelche Nachteile, um das Attribut überbeanspruchend? Zum Beispiel in dem vorherigen Beispiel, wenn die serialisierte Klasse wurde mit Knowntype (Basisklasse) markiert obwohl es ein ausdrücklicher Hinweis auf diese Art?

War es hilfreich?

Lösung

[KnownType] benötigt wird, um es über Subtypen zu erzählen. Der Nachteil von nicht verwendet es ist, dass die folgende nicht funktionieren:

[DataContract]
class Foo {}

[DataContract]
class Bar : Foo {}

mit einem Verfahren auf der WCF-Schnittstelle, dass Rückkehr:

public Foo GetFoo() { return new Bar(); }

Ohne das Attribut, das Serializer (vor allem für mex / proxy-generated-Typen) wird nicht wissen, über Bar , und es wird scheitern. Mit dem Attribut:

[DataContract, KnownType(typeof(Bar))]
class Foo {}

es wird Arbeit. Dies gilt nur für DataContractSerializer -. Mit NetDataContractSerializer Sie die Typ-Daten auf eine andere Weise erhalten

Andere Tipps

Wenn Sie mit XSD "Vererbung" in Ihrem Schema.

Sie haben es rückwärts bekommen; die Knowntype auf die Basisklasse und die Namen aller der abgeleiteten Klassen angewendet wird, die als Referenz auf der Basis weitergegeben werden könnten.

Zum Beispiel:

...
KnownType(typeof(POBoxAddress))
KnownType(typeof(StreetAddress))
KnownType(typeof(SingleLineAddress))
KnownType(typeof(ParsedAddress))
public abstract class AddressBase
{
    ...
}

Das Knowntype Attribut ist erforderlich, wenn Sie die Serialisierung nicht-Beton-Typen wie Schnittstellen oder Basisklassen. Der WCF-Serializer muss über alle möglichen Implementierungen der Schnittstelle oder vererbten Klasse kennen. Jegliche Implementierungen, dass es nicht kennt eine Serialisierung Ausnahme verursachen.

Eine possable Nutzung kann in dieser SO Frage

Es ist auch nützlich für Fälle wie folgt:

[DataContract]
[knownType(typeof(Person))]
public class KeyValue
{
  [DataMember]
  public string key {get; set;}

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

  // rest of the code
}

Nehmen wir nun an Wert enthält einen Gegenstand von anderen Klasse sagen Person. dann dies Sie alle Knowntype (typeof (Person))

hinzufügen müssen arbeiten
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top