序列化对象时忽略继承的类

时间:2011-03-26 13:30:11

标签: c# xml serialization inheritance

当我从一个类继承并序列化新类时,我获得了所有属性。 我怎么能防止这种情况? 我无法控制我继承的课程。所以我不能为它的属性添加属性(XmlIgnore)。

示例

class A 
{
    public string PropertyA {get;set;}
}

class B:A
{
    public string PropertyB {get;set;}
}

当我序列化类型为B的对象时,我同时获得PropertyA和PropertyB,我只想要PropertyB

我使用的Xml序列化

Type t = serObj.GetType();
XmlSerializer xser = new XmlSerializer(t);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);

xser.Serialize(sw, serObj);
string xml = sw.ToString();

4 个答案:

答案 0 :(得分:1)

如果B继承自A,则会继承PropertyA,而您无能为力。如果您在序列化PropertyA的实例时不想序列化B,那么您可能不应该首先继承A ...

无论如何,我不认为XML序列化可以帮助您完成您尝试做的事情,除非您自己实施IXmlSerializable ...

答案 1 :(得分:1)

这是我提出的解决方案。

        public void WriteXml(XmlWriter writer)
        {
            foreach (PropertyInfo propertyInfo in this.GetType().GetProperties())
            {
                string name = propertyInfo.Name;

                if (propertyInfo.DeclaringType != typeof(A))
                {
                    object obj = propertyInfo.GetValue(this, null);

                    if (obj != null)
                    {
                        writer.WriteStartElement(name);
                        string value = obj.ToString();
                        writer.WriteValue(value);
                        writer.WriteEndElement();
                    }
                }
            }
        }

答案 2 :(得分:0)

一种解决方案是在PropertyA上使用[Nonserialized]属性。请注意,使用此属性,PropertyA永远不会被序列化,包括序列化类A的实例时。这可以接受吗?

答案 3 :(得分:0)

晚会,但是:我只是偶然发现了你的问题,因为我有类似的问题。我继承自一个类,但是我的派生类的逻辑使得基类的一些属性变得冗余或过时以用于序列化,因此我不想将它们序列化。

我找到的解决方案不像你的那样自动但更灵活:覆盖基类属性并用[XmlIgnore]标记它们。覆盖中的实现可以只包括对基本实现的调用;覆盖的唯一目的是将XmlIgnore属性附加到它。

它的自动性较低,因为如果基类中的属性发生更改,则必须反映派生类中的更改。另一方面,这更灵活,因为您可以选择忽略哪些属性。

不可否认,这个解决方案不能很好地扩展,最适合在相关课程和人员之间有密切联系的小型项目。