Frage

Mit der XmlSerializer Kann ich meine Mitglieder in verschiedene namespaces für die Eltern geben.

Kann ich tun die gleiche Sache, die mit DataContractSerializer?

Ich möchte folgende XML:

<h:Type xmlns:h="http://schemas.e.com/WebServices"
    xmlns="http://schemas.e.com/WebServices">
  <Member xmlns="http://schemas.e.com/CoreTypes">0</Member>
</h:Type>

Ist dies möglich mit DataContractSerializer?

War es hilfreich?

Lösung

Sie können subdatacontracts in unterschiedlichen Namensräumen definieren und sie als Mitglieder einer anderen Datacontract verwenden, aber Sie können nicht die einzelnen Mitgliedsnamen und / oder Formen steuern. Die DataContractSerializer ist nicht für die feinkörnige Kontrolle über die „Form“ des XML ersetzen XmlSerializer soll.

Andere Tipps

Während es wahr ist, wie angegeben in diese Antwort von nitzmahone , dass ein bestimmter Daten Vertrages Typ nicht deklariert haben Mitglieder in mehreren namespaces, ist es möglich, dass es in eine Art Hierarchie, abgeleitete Typen angehören können verschiedene Daten Vertrages namespaces als die Basis-Typen, von denen Sie Erben.Wenn dies geschieht, jedes Mitglied wird serialisiert werden in den Namensraum, in dem es erklärt.Durch den Bau einer entsprechenden Typ-Hierarchie von XML-Entitäten mit Mitgliedern, die in unterschiedlichen namespaces werden können (de -) serialisiert DataContractSerializer.

Die spezifische Regeln sind wie folgt:

  1. Wenn eine Daten-Vertrag Typ ist ein Teil einer Vererbungshierarchie, Mitglieder-Daten seiner Basis-Typen sind immer in der Reihenfolge zuerst.1

  2. Daten-member serialisiert werden in der Daten-Vertrag namespace der Daten-Mitglied geben, in dem Sie deklariert sind.

  3. Der root-namespace von einem Daten-Vertrag Typ ist der namespace, der seine meisten abgeleiteten Typ.

  4. XML-Elemente (de)serialisiert werden in der angegebenen Reihenfolge durch Daten-Mitglied, Um. DataContractSerializer lässt sich nicht für Daten-member zu werden, frei nachbestellt, bei der Deserialisierung.2

  5. Sammlungen haben Ihre eigenen Regeln, angegeben Sammlung Typen, die in Verträgen Daten;diese Antwort nicht für Sie gelten.

Damit der XML-Code in der Frage verwendet werden können DerivedType in die folgende Hierarchie:

[DataContract(Name = "Base", Namespace = "http://schemas.e.com/CoreTypes")]
public class BaseType
{
    [DataMember]
    public int Member { get; set; }
}

[DataContract(Name = "Type", Namespace = "http://schemas.e.com/WebServices")]
public class DerivedType : BaseType
{
}

Und, im Allgemeinen, jede Sequenz der XML-Elemente in einer beliebigen Reihenfolge von namespace(s) kann eingeholt werden, indem die oben genannten Regeln zu konstruieren, die eine angemessene Art Hierarchie, bietet eine Problemumgehung, die erfüllt die Anforderung von Deserialisieren Elemente in verschiedenen namespaces.

Natürlich, wie eine Hierarchie kann unbequem sein, aus anderen Gründen, in dem die gewünschte Daten-Modell-Typen ersetzt werden kann, mit DTOs durch die Verwendung der data contract surrogate Mechanismus.


1 Daten-Mitglied, Um.

2 Daten-Member Bestellung und XML Deserialisierung

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top