Wie kann ich auf XmlAttributes
zugreifen, die auf Felder in einem IXmlSerializable
-Objekt unter Verwendung von XmlAttributesOverrides
angewendet werden?Zugriff auf XmlAttributesOverrides hinzugefügte Attribute in IXmlSerializable-Methoden
Probe IXmlSerializable Objekt:
public class Person : SomeBaseClass, IXmlSerializable
{
public string Name1;
public string Name2;
[XmlIgnore]
public string Name3;
public Person()
{
}
public Person(string first, string second, string third)
{
Name1 = first;
Name2 = second;
Name3 = third;
}
public XmlSchema GetSchema()
{
return null;
}
public void ReadXml(XmlReader reader)
{
// ....
}
public void WriteXml(XmlWriter writer)
{
FieldInfo[] finfo = this.GetType().GetFields();
foreach (FieldInfo finf in finfo)
{
FieldAttributes attr = finf.Attributes;
object[] atts = finf.GetCustomAttributes(true);
if (atts.Length == 0)
{
// handle field with no attributes ... should be just Name1
// but also get Name2 since XmlAttributOverrides' XmlIgnore is not
// included with GetCustomAttributes results.
writer.WriteElementString(finf.Name, (string)finf.GetValue(this));
}
else
{
// handle field with attributes ... should be Name2 and Name3
// but only get Name3 via [XmlIgnore] compiler generated attribute
}
}
}
}
Typische Aufschalten Schöpfung:
// parent app ...
public XmlSerializer CreateOverrider()
{
XmlAttributeOverrides xOver = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
attrs.XmlIgnore = true;
xOver.Add(typeof(Person), "name2", attrs);
XmlSerializer xSer = new XmlSerializer(typeof(Person), xOver);
return xSer;
}
private void button2_Click(object sender, EventArgs e)
{
// Custom XmlSerialize
Person pson = new Person("First", "Second", "Third");
XmlSerializer serializer = CreateOverrider();
TextWriter writer = new StreamWriter("PersonOverride.xml");
serializer.Serialize(writer, pson);
writer.Close();
}
// etc ...
Erstellt Ausgang:
<?xml version="1.0" encoding="utf-8"?><Person><Name1>First</Name1><Name2>Second</Name2></Person>
Ich brauche IXmlSerializable
zu verwenden, um Erbschaftsangelegenheiten von 'Somebaseclass' zu überwinden.
Das Problem ist, dass GetCustomArributes
keines der Attribute zurückgibt, die der XmlAttributeOverrides
Sammlung hinzugefügt werden - oder mache ich es falsch!?
Es ist auch wahrscheinlich, dass GetCustomAttributes
nicht gegeben, so Attribute sollen zurückzukehren, oder dass ich nicht verwenden XmlAttributeOverrides
in einer IXmlSerializable
Klasse soll.
Also ... irgendwelche Ideen oder Alternativen. Danke, dass du dir die Zeit genommen hast.
Gibt es einen besonderen Grund, warum Sie können nicht nur direkt zu Person-Klasse injizieren? Zum Beispiel make Methode SetOverrides (XmlAttributeOverrides overrides) auf Person-Klasse und rufen Sie direkt vor der Serialisierung auf? –
@OndrejSvejdar Dies funktioniert für die Serialisierung, aber NICHT für die Deserialisierung. –