【问题标题】:Ignore inherited class when serializing object序列化对象时忽略继承的类
【发布时间】:2011-03-26 13:30:11
【问题描述】:

当我从一个类继承并序列化新类时,我会得到所有的属性。 我怎样才能防止这种情况? 我无法控制我继承的类。所以我不能向它的属性(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();

【问题讨论】:

    标签: c# xml serialization inheritance


    【解决方案1】:

    如果B 继承自A,它会继承PropertyA,对此你无能为力。如果您不想在序列化B 的实例时序列化PropertyA,也许您一开始就不应该继承A...

    无论如何,我认为 XML 序列化不能帮助您完成您想做的事情,除非您自己实现 IXmlSerializable...

    【讨论】:

    • 最终实现了 ISerializeable。在 WriteXml 中,我遍历属性并检查它具有的 DeclaringType 并仅输出不具有类型“A”的那些。谢谢。在答案中添加了 WriteXml。
    【解决方案2】:

    这是我想出的解决方案。

            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();
                        }
                    }
                }
            }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我可能应该说我无法控制 A 类。将其添加到问题中:)
      • NonSerialized 与 XML 序列化无关......它被 BinaryFormatter(二进制序列化)等格式化程序使用
      • 如果我记得,[XmlIgnore] 是完成此操作的属性,尽管这对 OP 没有帮助,因为基类不受控制。
      【解决方案4】:

      聚会迟到了,但是:我只是偶然发现了你的问题,因为我有类似的问题。我从一个类继承,但是我的派生类的逻辑使基类的某些属性对于序列化来说是多余或过时的,所以我不想序列化它们。

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

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

      诚然,此解决方案无法很好地扩展,最适合涉及的班级和人员之间联系密切的小型项目。

      【讨论】:

        猜你喜欢
        • 2014-06-22
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多