XML序列化和空集合

时间:2008-09-16 03:59:48

标签: c# xml-serialization

我有一个定义为:

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

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

<delete />
发出

。如果列表&lt;&gt;删除设置为空

<delete xsi:nil="true" />
发出

。有没有办法使用属性来获取如果集合没有项目时不发出删除元素?

Greg - 非常感谢,我甚至没有读过IsNullable文档,只是假设它发出了不需要的信号。

Rob Cooper - 我试图避免使用ISerializable,但Gregs建议有效。我确实遇到了你在(1)中概述的问题,如果集合的长度为零,我只是返回null来打破一堆代码。为了解决这个问题,我创建了一个EventsBuilder类(我正在序列化的类称为事件),它管理Events类的底层对象的所有生命周期/创建,这些对象吐出我们的Events类以进行序列化。

4 个答案:

答案 0 :(得分:17)

我有同样的问题,如果字段为空或0,我不想要输出元素。 输出的XML不能使用xsi:null =“true”(按设计)。

我已经读过某个地方,如果你包含一个类型为bool的属性,其名称与你想要控制的字段相同,但附加了“Specified”,XMLSerializer将检查此属性的返回值以确定是否相应应该包括字段。

要在不实现IXMLSerializer的情况下实现此目的:

public List<Event> Delete { get; set; }
[XMLIgnore]
public bool DeleteSpecified
{
 get
 {
   bool isRendered = false;
   if (Delete != null)
   {
     isRendered = (Delete.Count > 0);
   } 

   return isRendered;
 }
 set
 {
 }
}

答案 1 :(得分:6)

如果设置IsNullable = false或只删除它(默认情况下为false),则不会发出“delete”元素。仅当集合等于null时才会起作用。

我的猜测是,在.NET方面的“可空性”与XML中可空元素相关的方面存在混淆 - 那些用xml:nil属性标记。 XmlArrayAttribute.IsNullable属性控制后者。

答案 2 :(得分:1)

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

XmlSerializer 正在完成它应该做的事情,将对象的当前状态保持为XML。现在,我不确定为什么当前的行为对你来说不对,因为如果你初始化了List,那么它 被初始化。

我认为你有三种选择:

  1. 如果集合有0个项目,则向Getter添加代码以返回null。这可能会破坏你的其他代码。
  2. 实施 IXmlSerializable 界面并自行完成所有工作。
  3. 如果这是一个常见的过程,那么您可能需要查看我的问题“XML Serialization and Inherited Types” - 是的,我知道它会处理另一个问题,但它会告诉您如何创建一个通用的中间序列化类然后可以“用螺栓固定”以允许封装血清化过程。您可以创建一个类似的类来处理覆盖null / zero-item集合的默认进程。
  4. 我希望这会有所帮助。

答案 3 :(得分:0)

您可以随时实施IXmlSerializer并手动执行序列化。

有关示例,请参阅http://www.codeproject.com/KB/cs/IXmlSerializable.aspx