我有一个属性定义为:
[XmlArray("delete", IsNullable = true)] [XmlArrayItem("contact", typeof(ContactEvent)), XmlArrayItem("sms", typeof(SmsEvent))] public ListDelete { get; set; }
如果List <> Delete没有项目
发出.如果List <> Delete设置为null
发出.有没有办法使用属性来获取如果集合没有项目不发出删除元素?
格雷格 - 非常感谢,我甚至没有读过IsNullable文档,只是假设它发出了不需要的信号.
Rob Cooper - 我试图避免使用ISerializable,但Gregs建议有效.我确实碰到了你在(1)中概述的问题,如果集合长度为零,我只是返回null而破坏了一堆代码.为了解决这个问题,我创建了一个EventsBuilder类(我正在序列化的类称为Events),它管理Events类的底层对象的所有生命周期/创建,这些对象吐出我们的Events类以进行序列化.
我有同样的问题,如果字段为空或0,我不想要输出一个元素.输出的XML不能使用xsi:null ="true"(按设计).
我已经读过某个地方,如果你包含一个bool类型的属性,其名称与你想要控制的字段相同,但附加了'Specified',XMLSerializer将检查这个属性的返回值,以确定相应的字段是否应该是包括在内.
要实现这一点而不实现IXMLSerializer:
public ListDelete { get; set; } [XMLIgnore] public bool DeleteSpecified { get { bool isRendered = false; if (Delete != null) { isRendered = (Delete.Count > 0); } return isRendered; } set { } }
如果设置IsNullable = false或只删除它(默认情况下为false),则不会发出"delete"元素.仅当集合等于null时,这才有效.
我的猜测是,在.NET方面的"可空性"与XML中可空元素相关的方面存在混淆 - 那些用xml:nil属性标记.XmlArrayAttribute.IsNullable属性控制后者.