【问题标题】:Getting XML serialization to automagically ignore non-serializable properties让 XML 序列化自动忽略不可序列化的属性
【发布时间】:2009-09-04 08:16:31
【问题描述】:

我正在使用 .NET 序列化类来 XML 序列化和记录传递给我的应用程序中某些函数的参数值。为此,我需要一种方法来 XML 序列化任何通过的类的属性值,但忽略任何不能被 XML 序列化的属性(例如任何 Image 类型的属性)。

我可以遍历我的类并使用 [XmlIgnore] 属性标记此类属性,但理想情况下,我想要一个仅跳过此类属性的序列化程序。

这可以实现吗?

【问题讨论】:

    标签: .net serialization xml-serialization


    【解决方案1】:

    您可以使用反射动态创建XmlAttributeOverrides 对象,以在相关属性上添加XmlIgnore 属性。您只需要实现逻辑来确定给定类型是否符合 XML 序列化的条件,并递归地浏览对象图。当你完成创建 XmlAttributeOverrides 对象后,只需将它传递给 XmlSerializer 构造函数

    【讨论】:

      【解决方案2】:

      这可能与您的“XMLIgnore”想法一样有效,但您可以使用 XPath 仅将可序列化部分传递给序列化函数。

      【讨论】:

        【解决方案3】:

        如果你控制一个通用的基类,你可以通过反射来实现——否则这很可能很麻烦。您可以实现自定义 Xml 序列化方案 - 这并不难,但我怀疑它是否值得。

        此外,如果您“自动”忽略所有类的不可序列化属性,则需要考虑这样做的级别 - 否则以前不可序列化的类本身会变成可序列化的,但只有它们自己的一些属性不是(完全)可序列化的。

        【讨论】:

          【解决方案4】:

          您应该继承 XmlSerializer,并覆盖虚拟受保护的 Serialize(object, XmlSerializationWriter) 方法。您可能需要实现自己的 XmlSerializationWriter。

          祝你好运!

          编辑:查看下方 Thomas 的评论。我猜他是对的。

          【讨论】:

          • 我建议不要使用这种方法:XmlSerializer 不直接执行序列化,它会生成另一个程序集来执行此操作。所以你必须改变序列化程序集的生成方式,这可能很难......
          猜你喜欢
          • 1970-01-01
          • 2014-05-21
          • 1970-01-01
          • 1970-01-01
          • 2013-08-17
          • 2016-05-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多