3 Stimmen

XmlIgnore funktioniert nicht

Ich habe ein Objekt, das ich serialisieren möchte, und die Ausgabe sieht ungefähr so aus:

       blabla 

wo Item eine Klasse ist, die von der Klasse root verwendet wird.

[Serializable]
[XmlType("root")]
public class Root { }

[Serializable]
[XmlInclude(typeof(Item))]
public class Items {}

[Serializable]
public class Item 
{ 
    [XmlElement("Value")]
    public string DefaultValue { get; set; }
}

In einigen Fällen möchte ich den Wert von Value ignorieren, und ich habe diesen Code

 var overrides = new XmlAttributeOverrides();
 var attributes = new XmlAttributes { XmlIgnore = true };
 attributes.XmlElements.Add(new XmlElementAttribute("Item"));                  
 overrides.Add(typeof(Item), "Value", attributes);               
 var serializer = new XmlSerializer(typeof(root), overrides);

aber der Wert wird immer noch in der Ausgabe geschrieben.

Was mache ich falsch?

3voto

Fun Mun Pieng Punkte 6441

Wenn der Wert immer ignoriert wird, ist es besser, das Attribut direkt dem Member zuzuweisen.

[Serializable]
[XmlInclude(typeof(Item))]
public class Items
{
    [XmlIgnore]
    public string Value
}

Wenn der Wert bedingt ignoriert wird, ist es wahrscheinlich besser, das Element aus der Stammklasse zu entfernen, bevor es serialisiert wird.

Was deinen Code betrifft, vermute ich (ich könnte mich irren, weil ich es noch nicht ausprobiert habe!), dass das Folgende ausreicht:

var overrides = new XmlAttributeOverrides();
var attributes = new XmlAttributes { XmlIgnore = true };
overrides.Add(typeof(Items), "Value", attributes);               
serializer =  new XmlSerializer(typeof(root), overrides);

Update: Ich habe den obigen Code getestet. Es funktioniert. :D Update erneut: Es sollte Items anstelle von Item sein, da Value in Items ist. Oder wenn du es anders magst, könnte es Value in Item sein und Item den ganzen Weg.

3voto

Steven Jeuris Punkte 17118

Jetzt, da Sie Ihre Frage aktualisiert haben, ist offensichtlich, was Sie falsch machen. :)

[Serializable]
public class Item 
{ 
    [XmlElement("Value")]
    public string DefaultValue { get; set; }
}

Sie sollten den Namen der Eigenschaft anstelle des XML-Namens übergeben, wie in der Dokumentation angegeben.

overrides.Add(typeof(Item), "DefaultValue", attributes);

... anstelle von ...

overrides.Add(typeof(Item), "Value", attributes);

Außerdem, wie in der Antwort von Fun Mun Pieng angegeben, sollten Sie das XmlElementAttribute nicht mehr hinzufügen, also entfernen Sie die folgende Zeile:

 attributes.XmlElements.Add(new XmlElementAttribute("Item"));

0voto

Davide Piras Punkte 42970

Ich glaube, dass das XMLIgnore-Attribut verwendet werden sollte, um ein öffentliches Element einer Klasse zu dekorieren, das mit dem XmlSerializable-Attribut dekoriert wurde, auf diese Weise würde es funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X