2009-03-26 10 views
4

Wie in Does the order of fields in C# matter? besprochen, wirkt sich die Reihenfolge der serialisierbaren Eigenschaften unter anderem auf die XmlSerializer-Ausgabe aus.Was steuert die XML-Serialisierungsreihenfolge von partiellen C# -Klassen?

Aber wenn Felder in 2 Dateien sind (mit partiellen Klassen), weiß jemand, was tatsächlich die resultierende Reihenfolge steuert? Das heißt, welche Eigenschaften stehen an erster Stelle?

(Hintergrund: Ich frage dies, weil ich in einem Szenario, in dem eine der 2 Dateien ist automatisch generiert von Xsd, und die andere wird manuell bearbeitet. Die Test-Ausgabe unterscheidet sich auf Entwickler-Boxen vs unsere Skript Wahrscheinlich ist dies ein Nebeneffekt der verschiedenen Unterschiede im Timing und in der Geschichte des xsd-> C# -Schritts in den 2 Umgebungen.Verschiedene Möglichkeiten zur Behebung, aber ich würde gerne den Kompilierungsprozess ein wenig besser verstehen, wenn möglich .)

Antwort

2

Nichts ist garantiert pro C# Spezifikation.

+0

Danke Mehrdad. Ich werde Ihre Antwort basierend auf meinen eigenen Beobachtungen etwas erweitern. 1. Die Bestellung ist nicht garantiert, wie Sie sagen. 2. Bei VS 2008 ist die Reihenfolge zumindest teilweise eine Funktion der Sortierreihenfolge der Dateinamen. Das heißt, das Umbenennen der Dateien kann sich auf die Reihenfolge auswirken. -Eric –

2

Ich habe festgestellt, dass die Verwendung des "einfachen" Ansatzes zum Erstellen eines Objekts durch Markieren von [Serializable] normalerweise nur für sehr einfache Implementierungen ausreicht.

Ich würde empfehlen, dass Sie die IXmlSerializable-Schnittstelle implementieren, die ziemlich einfach zu tun ist und Ihnen die ganze Kontrolle gibt, die Sie brauchen.

+0

Richtig, wir tun das an Orten, wo wir mehr oder weniger finden müssen. In diesem Fall überwog der Vorteil der einfachen Codewartung die absolute Kontrolle. (Wenn möglich, unser Muster ist die Behandlung von .xsd als Quelle, generieren Sie automatisch C# über xsd.exe als Pre-Build-Schritt und erweitern Sie die Teilklassen nach Bedarf.) Die "fix", die ich letztlich in diesem Fall wählte war, die Datei, die unsere Erweiterung enthält, einfach in die partielle Klasse umzubenennen. –

1

Hier ist, was wir durch das Update von einem bösen Fehler festgestellt:

Wir genau das gleiche Problem hatten, unsere Serialisierungsordnung nach einer Freigabe geändert hat, ohne dass die Serialisierung bezogenen Klassen zu ändern.

Wir hatten eine Hälfte einer Klasse von xsd-s generiert, und die andere Hälfte wurde von Hand gefertigt. Die Auftragsattribute waren wirkungslos. Was wir sahen, war, dass vor der Veröffentlichung die handgefertigten Teile zuerst serialisiert wurden und danach die Reihenfolge geändert wurde. Die Lösung befand sich in der Reihenfolge der Dateien in der Projektdatei, die die zwei Klassen enthielt. Es stellte sich heraus, dass der Serializer nach einem MSBuild-Build (auf unserem Build-Server) die Elemente der früheren (in der Datei csproj) ".cs" -Datei zuerst in das serialisierte XML einfügt. Das Ändern der Reihenfolge der ".cs" -Dateien in der csproj vertauschte die Reihenfolge und die generierten Teile waren nach Bedarf im XML vorhanden.

Dies ist mit der Antwort und Beobachtung von Eric Hirst oben ausgerichtet, als Umbenennen der Datei die csproj-Elemente neu geordnet (sie sind in der Regel in alphabetischer Reihenfolge). Achten Sie auch aus diesem Grund darauf, den csproj manuell zu bearbeiten.