Die Deserialisierung von DataContract schlägt fehl, da XML-Knoten nicht korrekt sortiert sind

8

Ich bin verblüfft über das Verhalten des DataContractSerializers. Unsere Konfiguration basiert auf XML. XML wird als Quelle für die DataContractSerializer.ReadObject-Methode verwendet. Kürzlich habe ich ein Problem festgestellt, als einige Eigenschaften des deserialisierten Objekts nicht festgelegt wurden. Ich habe die Änderungen verfolgt und festgestellt, dass diese Eigenschaften manuell in XML hinzugefügt wurden. Was meiner Meinung nach in Ordnung ist. Anscheinend war es in der Meinung von DataContractSerializer nicht OK, weil es erwartet, dass XML-Knoten alphabetisch geordnet werden. Ja wirklich?! Die Deserialisierung scheint eine sehr einfache Sache zu sein - sequenzielles Lesen von XML, Parsen des Knotennamens, Festlegen der entsprechenden Eigenschaft. Was ist der Zweck der Bestellung?

Gibt es eine Problemumgehung? Vielleicht eine Art von Einstellungen für DataContractSerializer?

    
Schultz9999 20.03.2012, 22:46
quelle

2 Antworten

3

Ich bin kürzlich auf dieses Problem gestoßen. Um es zu umgehen, habe ich XmlSerializer verwendet und die explizite Reihenfolge von den XmlElement -Attributen entfernt:

%Vor%

Es gibt einige weitere Informationen zu meinem Blogbeitrag .

Wenn Sie wissen möchten, warum die Bestellung wichtig ist, liegt das daran, dass eine sequence in XSD eine definierte Reihenfolge hat und die Web-Service-Verträge mit XSD definiert sind.

Von der Spezifikation :

  

Die Konsequenz dieser Definition ist, dass jedes Element, das in einer Instanz erscheint, deren Typ als USAddress deklariert ist (z. B. shipTo in po.xml), aus fünf Elementen und einem Attribut bestehen muss. Diese Elemente müssen wie folgt benannt werden: name, street, city, state und zip, wie in den Werten der Namensattribute der Deklarationen angegeben, und die Elemente müssen in derselben Reihenfolge (Reihenfolge) angezeigt werden, in der sie deklariert sind.

    
ta.speot.is 21.03.2012, 04:59
quelle
3

Sie können den Order-Member von DataMemberAttribute verwenden, um dabei zu helfen, aber in den meisten Fällen: XML ist auftragsspezifisch (für Elemente, keine Attribute) - daher ist es nicht speziell falsch.

Das heißt: Wenn Sie eine genaue Kontrolle über die XML-Serialisierung wünschen, ist DataContractSerializer eine schlechte Wahl. XmlSerializer bietet mehr Kontrolle - und ist weniger pingelig, um die Reihenfolge zu ändern.

    
Marc Gravell 20.03.2012 23:04
quelle

Tags und Links