识别类中指定的XML序列化规则

本文关键字:XML 序列化 规则 识别 | 更新日期: 2023-09-27 18:07:14

是否可以这样做:

在我的代码的另一部分创建一个 someeclass 的实例AND
使用这个新创建的实例/对象,我可以获得:

[System.Xml.Serialization.XmlElementAttribute("someClass")]XML序列化规则

我想要达到的目标:
1. 确定 someeclass 是否在其中的任何属性上包含XML序列化规则
2. 如果它确实包含这样的序列化规则,标识规则。(也就是说,它是否……XMLIgnore || XMLElement || XMLAttribute…等)


问题中提到的类:

    Class SomeClass
    {
            SomeOtherClass[] privtArr;
            [System.Xml.Serialization.XmlElementAttribute("SomeOtherClass")]
            public SomeOtherClass[] anInstance
            {
                get
                {
                    return this.privtArr;
                }
                set
                {
                    this.privtArr = value;
                }
            } 
    }

识别类中指定的XML序列化规则

你不需要创建一个实例;只要看看Type,特别是GetFields()GetProperties()。循环遍历公共非静态字段/属性,并检查Attribute.GetCustomAttribute(member, attributeType) -即

public class Test
{
    [XmlElement("abc")]
    public int Foo { get; set; }
    [XmlIgnore]
    public string Bar { get; set; }
    static void Main()
    {
        var props = typeof (Test).GetProperties(
              BindingFlags.Public | BindingFlags.Instance);
        foreach(var prop in props)
        {
            if(Attribute.IsDefined(prop, typeof(XmlIgnoreAttribute)))
            {
                Console.WriteLine("Ignore: " + prop.Name);
                continue; // it is ignored; stop there
            }
            var el = (XmlElementAttribute) Attribute.GetCustomAttribute(
                   prop, typeof (XmlElementAttribute));
            if(el != null)
            {
                Console.WriteLine("Element: " + (
                  string.IsNullOrEmpty(el.ElementName) ?
                  prop.Name : el.ElementName));
            }
            // todo: repeat for other interesting attributes; XmlAttribute,
            // XmlArrayItem, XmlInclude, etc...
        }
    }
}

如果需要创建实例,请使用newActivator.CreateInstance

你甚至不需要实例化SomeClass

使用反射来列出typeof(SomeClass)的(公共)字段和属性。然后,对于每个字段/属性,枚举属性并过滤您感兴趣的属性(例如XmlElement(), XmlAttribute(),…)

注意,XmlSerializer序列化公共字段和属性,即使它们没有XmlBlah属性。除非它们被标记为[XmlIgnore()],否则它们是序列化的。然后,您也应该查找此属性。

当然,您也可能对类级别的Xml属性感兴趣。