XmlSerializer: Wie wird ein Enumerationswert deserialisiert, der nicht mehr existiert?

8

Ich verwende den XMLSerializer, um diese Klasse in einer Datei zu speichern. Die Klasse hat eine Zeichenfolge und eine Enumeration, wie unten gezeigt:

%Vor%

Wenn es serialisiert wird, sieht es so aus.

%Vor%

Ich habe dieses Objekt für mehrere Versionen ohne Probleme serialisiert und deserialisiert. Ich möchte nicht länger Feuchtigkeit unterstützen, also habe ich sie aus dem Enum entfernt. Dies führt jedoch zu einer Ausnahme beim Deserialisieren aus XML, da der Wert im TypeEnum-Feld Humidity kein gültiger Wert für TypeEnum ist. Das macht Sinn, aber wie geht das?

Was ich tun möchte, ist diesen Fehler einfach zu ignorieren. Und belassen Sie den Wert als null. Ich habe versucht, die OnUnknownElement XmlDeserilizationEvent-Klasse zu implementieren. Leider fängt dies diesen Fehler nicht ein.

Irgendwelche Ideen, wie man diesen Fehler fängt und ignoriert (ich kann aufräumen, nachdem die Deserialisierung abgeschlossen ist).

Mitch

    
Mitch 22.05.2012, 18:53
quelle

4 Antworten

5

Sie können das Element Veraltet

markieren %Vor%     
msmucker0527 22.05.2012 18:56
quelle
4

Es wird allgemein als schlechte Praxis angesehen, ein Enumerationselement zu entfernen, nachdem Ihre Bibliothek bereits verwendet wird. Warum lassen Sie das Mitglied nicht an Ort und Stelle, sondern markieren Sie es mit dem Attribut [Obsolete] , um eine zukünftige Verwendung zu verhindern? Die Angabe des zweiten Parameters des ObsoleteAttribute(string,bool) -Konstruktors als true würde zu einem Fehler bei der Kompilierung führen, wenn das Symbol markiert ist Mitglied wird zugegriffen.

%Vor%

Um den Fehler beim Überprüfen von deserialisierten Werten zu umgehen, könnten Sie den zugrunde liegenden Wert vergleichen: typeEnum == (TypeEnum)2 .

    
Douglas 22.05.2012 19:01
quelle
2

Sie können Attribute verwenden, um Knotennamen zu ändern und Elemente aus der XML-Serialisierung auszublenden, indem Sie nur dieses eine Element manuell analysieren:

%Vor%

Pro Kommentar scheint es etwas Verwirrung zu geben; hier ist ein funktionierendes Beispiel als Visual Studio 2010-Projekt. Dieser Ansatz ist eine einfache Möglichkeit, nur eine Eigenschaft eines Objekts manuell zu analysieren (wobei der XmlSerializer weiterhin für die XML-Analyse verwendet wird).

    
user423430 22.05.2012 19:45
quelle
1

Sie könnten IXmlSerializable implementieren, wo Sie etwas verwenden können TryParse für das Enum.

Aber ich stimme den anderen Postern zu, die das Obsolete-Attribut verwenden.

    
rumpelstiefel 22.05.2012 19:04
quelle