c# - 派生类的 XMLIgnore 属性

标签 c# inheritance xml-serialization

我在标有 XmlIgnore 属性的基类中有一个属性。当我派生此类并且不覆盖(而不是 Xml-attributes in interfaces and abstract classes )此属性时,是否保留此属性以便派生类具有也具有 XmlIgnore 属性的属性,或者我是否必须覆盖属性以重置属性?

最佳答案

如果您的派生类未使用 XmlIgnore 属性集覆盖该属性,则该属性将在序列化时被适当忽略。

如果您的派生类确实覆盖了该属性,并且忘记设置 XmlIgnore 属性,则该属性将被正式序列化。

显示行为的示例代码:

using System;
using System.Linq;
using System.Reflection;
using System.Xml.Serialization;

[Serializable]
public abstract class myBaseClass
{
    [XmlIgnore]
    public virtual bool aBoolean { get; set; }

    public int anInt { get; set; }
}

[Serializable]
public class myDerivedClass : myBaseClass
{
    public string derivedString { get; set; }
}

[Serializable]
public class overrideXmlIgnore : myBaseClass
{
    // no XmlIgnore
    public override bool aBoolean
    {
        get
        {
            return base.aBoolean;
        }
        set
        {
            base.aBoolean = value;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        // build array of types we can serialize/deserialize
        // uses Linq and Reflection namespaces
        Type[] derivedTypes = (from lAssembly in AppDomain.CurrentDomain.GetAssemblies()
                               from lType in lAssembly.GetTypes()
                               where typeof(myBaseClass).IsAssignableFrom(lType)
                               select lType).ToArray();

        // build a test object to serialize with XMLIgnore still used
        myDerivedClass m = new myDerivedClass();
        m.aBoolean = true; // this property is ignored by default
        m.derivedString = "test";

        // set a file path to serialize to
        string testFilePath = "C:\\temp\\test.xml";

        // serialzie the object
        XmlSerializer x = new XmlSerializer(typeof(myBaseClass), derivedTypes);
        System.IO.StreamWriter sw = new System.IO.StreamWriter(testFilePath);
        x.Serialize(sw, m);
        sw.Close();

        // deserialize the object
        System.IO.StreamReader sr = new System.IO.StreamReader(testFilePath);
        myBaseClass deserializedObject = (myBaseClass)x.Deserialize(sr);
        sr.Close();

        // check the object's properties
        // aBoolean is false, even though the serialized object m set it to true, because of XmlIgnore
        Console.WriteLine("aBoolean = " + deserializedObject.aBoolean.ToString());

        // repeat process for the derived class that overrides and does not set XmlIgnore
        overrideXmlIgnore o = new overrideXmlIgnore();
        o.aBoolean = true;
        sw = new System.IO.StreamWriter(testFilePath);
        x.Serialize(sw, o);
        sw.Close();
        sr = new System.IO.StreamReader(testFilePath);
        deserializedObject = (myBaseClass)x.Deserialize(sr);

        // check the object's properties
        // aBoolean is true, as we no longer XmlIgnore
        Console.WriteLine("aBoolean = " + deserializedObject.aBoolean.ToString());

    }
}

关于c# - 派生类的 XMLIgnore 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25719916/

相关文章:

c# - 定义 "dynamic"枚举

c# - 在控制台应用程序 C# 中实现单例的最佳方式?

c# - ASP.NET Web API - 如何更改 XML 对象图中的最大项数

c++ - 公共(public)虚方法在继承类中被重写为 protected

c# - XmlSerializer 在反序列化时抛出异常

.net - XML 中包含空值的类型化数据集

c# - 如何集成 NLog 将日志写入 Azure Streaming 日志

c# - Linq to entities 不知道 .Date 运算符是什么

java - 如何从List访问子类对象的方法

PHP (7.1) 继承问题