2008-08-29 15 views
5

Ich habe einige Posts zu Änderungen in .NET 3.5 SP1 gesehen, stolperte aber in eine, die ich noch Dokumentation für gestern zu sehen habe. Ich hatte Code, der gerade gut auf meinem Computer funktioniert, von VS, msbuild Befehlszeile, alles, aber es scheiterte auf dem Erstellungsserver (der .NET 3.5 RTM ausführt).XmlSerializer ändert sich in .NET 3.5 SP1

In SP1 läuft der obige Code gut. In RTM erhalten Sie eine InvalidOperationException:

Kann keine temporäre Klasse generieren (Ergebnis = 1). Fehler CS0200: Eigenschaft oder Indexer ‚ConsoleApplication2.Foo.Bar‘ nicht zugeordnet werden kann - es ist nur

Natürlich gelesen wird, ist alles, was benötigt, um es unter RTM laufen zu lassen ist das Hinzufügen von [XmlIgnore] in die Bar Eigentum.

Meine Google Fu ist offensichtlich nicht in der Lage, Dokumentation dieser Art von Änderungen zu finden. Gibt es irgendwo eine Änderungsliste, die diese Änderung auflistet (und ähnliche Veränderungen unter der Haube, die aufspringen und "Gotcha" rufen könnten)? Ist das ein Fehler oder eine Funktion?

EDIT: In SP1, wenn ich hinzugefügt, um ein <Bar /> Element oder stellen Sie [XmlElement] für die Bar-Eigenschaft, wird es nicht deserialisiert erhalten. Es schlägt nicht vor SP1 fehl, wenn es versucht, deserialize - es löst eine Ausnahme aus, wenn der XmlSerializer erstellt wird.

Das lässt mich mehr darauf hin, dass es ein Fehler ist, besonders wenn ich ein [XmlElement] Attribut für Foo.Bar setze. Wenn es nicht tun kann, was ich von ihm erwarte, sollte es eine Ausnahme auslösen, anstatt Foo.Bar still zu ignorieren. Andere ungültige Kombinationen/Einstellungen von XML-Serialisierungsattributen führen zu einer Ausnahme.

BEARBEITEN: Vielen Dank, TonyB, ich wusste nicht über die Einstellung der Temp Dateien Speicherort. Für diejenigen, die über ähnliche Probleme in der Zukunft kommen, müssen Sie eine zusätzliche Konfigurations Flagge:

<system.diagnostics> 
    <switches> 
    <add name="XmlSerialization.Compilation" value="1" /> 
    </switches> 
</system.diagnostics> 
<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

Auch ein [XmlElement] Attributs auf der Bar-Eigenschaft mit der Einstellung wurde keine Erwähnung in der erzeugten Serialisierungsassembly gemacht -, die dies ziemlich fest in den Bereich eines still verschluckten Fehlers (aka, ein Bug) bringt. Entweder das oder die Designer haben entschieden, dass [XmlIgnore] für Eigenschaften, die nicht festgelegt werden können, nicht länger erforderlich ist - und Sie würden dies in den Versionshinweisen change lists oder XmlIgnoreAttribute documentation erwarten.

Antwort

4

In SP1 wird die foo.Bar-Eigenschaft ordnungsgemäß deserialisiert?

In pre SP1 können Sie das Objekt nicht deserialisieren, da die Methode set der Eigenschaft Bar privat ist, sodass XmlSerializer diesen Wert nicht festlegen kann. Ich bin mir nicht sicher, wie SP1 es abhebt.

Sie könnten versuchen, diese zu Ihrem web.config hinzufügen/app.config

<system.xml.serialization> 
    <xmlSerializer tempFilesLocation="c:\\foo"/> 
</system.xml.serialization> 

Das wird die Klasse durch die XmlSerializer in c erzeugt setzen: \ foo, so dass Sie sehen können, was es in SP1 tut vs RTM

+1

Dies scheint das Problem in .NET 4 nicht zu beheben – Levitikon

0

Ich mag dieses neue (?) Verhalten, weil das XML-Dokument Bar nicht erwähnt, also sollte der Deserializer nicht einmal versuchen, es zu setzen.