XML序列化和空集合

Nic*_*ong 3 c# xml-serialization

我有一个属性定义为:

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

如果List <> Delete没有项目

<delete />
Run Code Online (Sandbox Code Playgroud)

发出.如果List <> Delete设置为null

<delete xsi:nil="true" />
Run Code Online (Sandbox Code Playgroud)

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

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

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

the*_*zda 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
 {
 }
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎适用于非值类型,如上面显示的列表中所示.为简洁起见,您可以将代码缩短为:get {return Delete!= null && Delete.Count> 0; } (2认同)

Gre*_*egK 6

如果设置IsNullable = false或只删除它(默认情况下为false),则不会发出"delete"元素.仅当集合等于null时,这才有效.

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

  • 这不回答这个问题?"如果集合没有项目,那么使用属性来获取删除元素是不是会被释放?" 这基本上是提问者现在的情况? (3认同)