【问题标题】:Declare [XmlElement(IsNullable = true)] at class level在类级别声明 [XmlElement(IsNullable = true)]
【发布时间】:2012-02-29 12:25:48
【问题描述】:

有没有办法在类级别声明 [XmlElement(IsNullable = true)] 以便类中的所有属性都将被 XML 序列化,即使它们为空?

例如

public BankAccount BankAccount { get; set; }

应该导致<BankAccount xsi:nil="true" />,而不是默认的缺失元素。

我试过了,但编译器(正确地)声明该属性对类声明无效。

这样做的原因是我不想为所有属性都指定这个。


编辑:这是我正在使用的序列化方法:

        var serializer = new XmlSerializer(FormType);
        var stream = new MemoryStream();

        serializer.Serialize(stream, form);

【问题讨论】:

  • 您是使用XmlSerializer 还是DataContractSerializer 执行此操作,您是在Web 服务中执行此操作吗?如果您在 Web 服务之外使用 XmlSerializer,您可能可以使用 XmlAttributesOverride 的重载来强制属性(尽管我从未尝试过)。它也可能在旧的 ASMX 样式 Web 服务中也可用,但我相当肯定你不能通过 XmlSerializerFormatAttribute 使用 WCF 来做到这一点。
  • XmlSerializer 在一个类中将一个类持久化到一个 xml 文件中。
  • 可能值得看看XmlAttributesOverride 类并使用XmlSerializer.Serialize 的重载来接受它的实例。我的理解是,您可以通过在 XmlAttributeOverride 实例中明确指定覆盖来覆盖所有 Xml 属性行为。我从来没有这样做过,所以我不知道它是如何工作的,但我知道我已经看到过类似的问题,以此作为答案。
  • 无论如何它都会反序列化为 null,不管它是否明确地这样写,除非这不是无参数构造函数中的默认值。你到底想通过这个实现什么?可能有足够的解决方法。 (例如,如果您只需要跟踪某个其他应用程序中的所有公共属性,您可以通过反射轻松做到这一点。)
  • @Zenexer - 这不适用于值类型。 This 博客提供了一个使用 DateTime 的示例。

标签: c# attributes properties xml-serialization


【解决方案1】:

不幸的是,在为 XML 序列化注释类时,您必须明确说明。 除非您想要默认行为,否则每个属性都必须使用其自己的 XmlElement 属性进行注释。

【讨论】:

    【解决方案2】:

    【讨论】:

    • 那个链接好像失效了。
    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2011-09-05
    • 2010-12-10
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    相关资源
    最近更新 更多