是否可以在派生类中添加XmlIgnore属性?

问题描述 投票:1回答:1

我有类动物和继承它的狗和猫类。 Class Animal有属性X.我想为没有“X”属性的“Dog”和带有“X”属性的“Cat”生成XML。 XmlIgnore在我预期的方式不起作用。

我试图使用虚拟属性,然后在派生类中重写它,但它不起作用。

class Program
{
    static void Main(string[] args)
    {
        Dog dog = new Dog();
        Cat cat = new Cat();

        SerializeToFile(dog, "testDog.xml");
        SerializeToFile(cat, "testCat.xml");
    }

    private static void SerializeToFile(Animal animal, string outputFileName)
    {
        XmlSerializer serializer = new XmlSerializer(animal.GetType());

        TextWriter writer = new StreamWriter(outputFileName);
        serializer.Serialize(writer, animal);
        writer.Close();
    }
}
public abstract class Animal
{
    public virtual int X { get; set; }
}
public class Dog : Animal
{
    [XmlIgnore]
    public override int X { get; set; }
}
public class Cat : Animal
{
    public override int X { get; set; }
}
c# xml-serialization xmlignore
1个回答
0
投票

即使你不再需要它,我仍然找到了解决这个问题的方法。

您可以创建XmlAttributeOverrides并为某些类的字段设置XmlAttributes.XmlIgnore属性。

private static void SerializeToFile(Animal animal, string outputFileName)
{
    // call Method to get Serializer
    XmlSerializer serializer = CreateOverrider(animal.GetType()); 
    TextWriter writer = new StreamWriter(outputFileName);
    serializer.Serialize(writer, animal);
    writer.Close();
}

// Return an XmlSerializer used for overriding.
public XmlSerializer CreateOverrider(Type type)
{
    // Create the XmlAttributeOverrides and XmlAttributes objects.
    XmlAttributeOverrides xOver = new XmlAttributeOverrides();
    XmlAttributes attrs = new XmlAttributes();

    /* Setting XmlIgnore to true overrides the XmlIgnoreAttribute
     applied to the X field. Thus it won't be serialized.*/
    attrs.XmlIgnore = true;
    xOver.Add(typeof(Dog), "X", attrs);

    XmlSerializer xSer = new XmlSerializer(type, xOver);
    return xSer;
}

当然,你也可以通过将attrs.XmlIgnore设置为false来做相反的事情。

查看this了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.