を使用してIXmlSerializable
オブジェクトのフィールドに適用されるXmlAttributes
にアクセスするにはどうすればよいですか?XmlAttributesOverridesにIXmlSerializableメソッドの属性が追加されました
サンプルIXmlSerializableオブジェクト:
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
}
}
}
}
典型的なオーバーライドの作成:
// 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 ...
作成された出力:
<?xml version="1.0" encoding="utf-8"?><Person><Name1>First</Name1><Name2>Second</Name2></Person>
私は 'SomeBaseClass' からの継承の問題を克服するためにIXmlSerializable
を使用する必要があります。
GetCustomArributes
は、XmlAttributeOverrides
コレクションに追加された属性を返さないか、間違っていますか?
GetCustomAttributes
は、追加された属性を返すためにサポートされていないか、またはIXmlSerializable
クラスにXmlAttributeOverrides
を使用するはずがない可能性があります。
だから...任意のアイデアや代替。 時間をいただきありがとうございます。
いずれかの特定の理由は、あなただけの直接Personクラスにそれらを注入することができない理由は、ありますか?たとえば、PersonクラスのメソッドSetOverrides(XmlAttributeOverridesオーバーライド)を作成し、シリアル化する直前に呼び出します。 –
@OndrejSvejdarこれは直列化では機能しますが、逆シリアル化では機能しません。 –