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

时间:2011-08-30 10:06:48

标签: c# serialization xml-serialization

是否可以执行以下操作:

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

[System.Xml.Serialization.XmlElementAttribute( “SomeClass的”)] XML序列化规则

我想要实现的目标:
1.确定 SomeCLass 是否在其中的任何属性上包含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;
                }
            } 
    }

2 个答案:

答案 0 :(得分:2)

您不需要创建实例;只需查看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

答案 1 :(得分:1)

您甚至不需要实例化SomeClass。

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

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

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