我有一个定义为:
的属性[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类以进行序列化。
答案 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,那么它 被初始化。
我认为你有三种选择:
我希望这会有所帮助。
答案 3 :(得分:0)
您可以随时实施IXmlSerializer并手动执行序列化。
有关示例,请参阅http://www.codeproject.com/KB/cs/IXmlSerializable.aspx。