IXmlSerializable
nesnesindeki IXmlSerializable
nesnesindeki alanlara XmlAttributesOverrides
kullanarak nasıl erişirim?Erişim XmlAttributesOverrides eklenen öznitelikler IXmlSerializable yöntemleriyle
Numune IXmlSerializable nesnesi:
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
}
}
}
}
Tipik geçersiz kılma oluşturma:
// 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 ...
düzenlendi Çıktı:
<?xml version="1.0" encoding="utf-8"?><Person><Name1>First</Name1><Name2>Second</Name2></Person>
Ben SomeBaseClass 'dan miras sorunları aşmak için IXmlSerializable
kullanmak gerekir.
Sorun, GetCustomArributes
'un XmlAttributeOverrides
koleksiyonuna eklenen özelliklerden herhangi birini iade etmemesidir - ya da yanlış yapıyorum!
Ayrıca, GetCustomAttributes
, bu ek öznitelikleri döndürmek için SORUMLU DEĞİLDİR veyaIXmlSerializable
sınıfında kullanmamam gerekir.
Yani ... herhangi bir fikir veya alternatif. Zaman ayırdığınız için teşekkürler.
herhangi özel bir nedeni sadece doğrudan Kişi bunları sınıfa enjekte edemez neden var mı? Örneğin, set sınıfında SetOverrides (XmlAttributeOverrides overrides) yöntemini yapın ve serileştirilmeden hemen önce arayın. –
@OndrejSvejdar Bu seri hale getirme için çalışır, ancak seri hale getirme için DEĞİLDİR. –