当前位置:  开发笔记 > 编程语言 > 正文

XML序列化和空集合

如何解决《XML序列化和空集合》经验,为你挑选了2个好方法。

我有一个属性定义为:

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

如果List <> Delete没有项目


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


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

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

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



1> theahuramazd..:

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

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

要实现这一点而不实现IXMLSerializer:

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

   return isRendered;
 }
 set
 {
 }
}


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

2> GregK..:

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

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


这不回答这个问题?"如果集合没有项目,那么使用属性来获取删除元素是不是会被释放?" 这基本上是提问者现在的情况?
推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有