代码之家  ›  专栏  ›  技术社区  ›  Nic Strong

XML序列化和空集合

  •  3
  • Nic Strong  · 技术社区  · 16 年前

    我的财产定义如下:

    [XmlArray("delete", IsNullable = true)]
    [XmlArrayItem("contact", typeof(ContactEvent)),
     XmlArrayItem("sms", typeof(SmsEvent))]
    public List<Event> Delete { get; set; }
    

    如果列表<gt;删除没有项目

    <delete />
    

    发射。如果列表<gt;删除设置为空

    <delete xsi:nil="true" />
    

    发射。如果集合没有项,是否有方法使用属性来获取不发出的删除元素?

    Greg -太好了,谢谢,我甚至没有读过“无价值”文档,只是假设它是在发送不需要的信号。

    Rob Cooper -我本来想避免使用ISerializable,但是Gregs的建议有效。我确实遇到了您在(1)中概述的问题,如果集合的长度为零,我只返回空值就破坏了一堆代码。为了解决这个问题,我创建了一个eventsbuilder类(我正在序列化的类称为events),它管理events类的所有生存期/底层对象的创建,这些对象将我们的events类吐出来进行序列化。

    4 回复  |  直到 12 年前
        1
  •  6
  •   GregK    16 年前

    如果将isNullable设置为false或只删除它(默认为false),则不会发出“delete”元素。只有当集合等于空时,此操作才有效。

    我的猜测是,在.NET中的“nullability”和XML中与nullable元素相关的“nullability”之间存在混淆,即那些用xml:nil属性标记的元素。xmlarayattribute.isNullable属性控制后者。

        2
  •  17
  •   theahuramazda    15 年前

    我也遇到过同样的问题,如果字段为空或0,我不希望输出元素。 输出的XML无法使用xsi:null=“true”(按设计)。

    我在某个地方读到,如果您包含一个bool类型的属性,该属性与要控制的字段同名,但附加了“specified”,则xmlserializer将检查该属性的返回值,以确定是否应包含相应的字段。

    要在不实现IXML序列化程序的情况下实现这一点,请执行以下操作:

    public List<Event> Delete { get; set; }
    [XMLIgnore]
    public bool DeleteSpecified
    {
     get
     {
       bool isRendered = false;
       if (Delete != null)
       {
         isRendered = (Delete.Count > 0);
       } 
    
       return isRendered;
     }
     set
     {
     }
    }
    
        3
  •  1
  •   Community c0D3l0g1c    7 年前

    首先,我会说“问问你自己” 什么是序列化? “。

    这个 XML串行化器 正在执行它应该执行的操作,将对象的当前状态持久化为XML。现在,我不知道为什么当前的行为不适合您,因为如果您已经初始化了列表,那么 初始化。

    我认为你有三个选择:

    1. 如果集合中有0个项,请向getter添加代码以返回空值。这可能会破坏您拥有的其他代码。
    2. 实施 IXML可序列化 把所有的工作都交给你自己去做。
    3. 如果这是一个常见的过程,那么您可能想看看我的问题。” XML Serialization and Inherited Types “-是的,我知道它处理另一个问题,但它向您展示了如何创建一个通用的中介序列化类,然后可以“栓接”该类以允许封装序列化过程。您可以创建一个类似的类来处理为空/零项集合重写默认进程的问题。

    我希望这有帮助。

        4
  •  0
  •   Craig Eddy    16 年前

    您可以始终实现IXML序列化程序并手动执行序列化。

    http://www.codeproject.com/KB/cs/IXmlSerializable.aspx 举个例子。