【问题标题】:.net XmlSerializer, ignore base class properties.net XmlSerializer,忽略基类属性
【发布时间】:2009-07-07 01:37:30
【问题描述】:

假设我们有一个来自基类“System.Windows.Controls”的派生类“SerializableLabel”。

[XmlRoot("SerializableLabel")]
public class SerializableLabel : Label
{
    public string foo = "bar";
}

我想序列化这个类,但忽略父类中的所有属性。理想情况下,xml 看起来像:

<SerializableLable>
    <foo>bar</foo>
</SerializableLable>

如何最好地做到这一点?

我的第一次尝试使用了典型的 XmlSerializer 方法:

XmlSerializer s = new XmlSerializer(typeof(SerializableLabel));
TextWriter w = new StreamWriter("test.xml");
s.Serialize(w, lbl);
w.Close();

但这会引发异常,因为序列化程序会尝试序列化作为接口(ICommand 命令)的基类属性。

【问题讨论】:

    标签: c# .net xml-serialization


    【解决方案1】:

    上述问题的一个可能根源(包括 JP 指出的问题)是您的类层次结构试图违反Liskov Substitution Principle。简单来说,派生类尝试做基类已经做的事情。换句话说,您正在尝试创建一个无法替代基本标签的派生标签。

    这里最有效的补救措施可能涉及解耦 SerializableLabel 试图做的两件事,(a) 与 UI 相关的函数和 (b) 存储可序列化数据,并将它们放在不同的类中。

    【讨论】:

    • 感谢您的回答!看来我违反了 Liskov 替换原则。也许这是因为我非常热衷于忽略基类中的属性。事实上,我只想忽略那些阻止标签序列化的属性——例如那些类型是接口的属性。
    【解决方案2】:

    如果您想在序列化期间忽略属性,可以使用 Xml 属性覆盖。
    有关属性覆盖的介绍,请参阅 this question

    【讨论】:

      【解决方案3】:

      您可以使用IXmlSerializable 编写自定义序列化程序,但会造成序列化无法正确重构类的情况。假设某人是您的 SerializableLabel 上的 BackColor,它不会正确地通过序列化过程。

      【讨论】:

        【解决方案4】:

        在您的 text.xml 文件中,您可能希望将根重命名为 SerializableLabel,而不是 SerializableLable(小错字)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-07-13
          • 2011-10-03
          • 1970-01-01
          • 1970-01-01
          • 2013-07-30
          • 2023-04-04
          • 1970-01-01
          相关资源
          最近更新 更多