XML序列化和空集合
XML序列化和空集合
我有一个属性定义如下:
[XmlArray("delete", IsNullable = true)] [XmlArrayItem("contact", typeof(ContactEvent)), XmlArrayItem("sms", typeof(SmsEvent))] public ListDelete { get; set; }
如果List<> Delete没有任何项,则会生成
Greg - 完美,谢谢!我甚至没有阅读IsNullable的文档,只是假设它表示不是必需的。
Rob Cooper - 我试图避免使用ISerializable,但Greg的建议有效。我确实遇到了你在(1)中提到的问题,如果集合长度为零,只返回null会导致我破坏了很多代码。为了解决这个问题,我创建了一个EventsBuilder类(我要序列化的类名为Events),它管理了Events类的所有生命周期/创建,以便为序列化生成Events类的实例。
XML序列化和空集合
首先,我会问你自己“什么是序列化?”。
XmlSerializer正在做它应该做的事情,将对象的当前状态持久化为XML。现在,我不确定为什么当前的行为对你来说不是“正确”的,因为如果你已经初始化了List,那么它是已经初始化的。
我认为你在这里有三个选项:
1. 在Getter中添加代码,如果集合中没有任何项,则返回null。但这可能会破坏你已有的其他代码。
2. 实现IXmlSerializable接口,并自己完成所有工作。
3. 如果这是一个常见的过程,那么你可能想看一下我的问题“XML序列化和继承类型”-是的,我知道它涉及到另一个问题,但它向你展示了如何创建一个通用的中介序列化类,然后可以“附加”它以允许封装序列化过程。你可以创建一个类似的类来处理覆盖默认过程以处理null/零项集合。
希望对你有所帮助。
XML序列化和空集合
在进行XML序列化时,经常会遇到一个问题:当集合为空时,是否可以通过属性来控制不发出“delete”元素。下面将讨论该问题的原因以及解决方法。
首先,需要了解一个概念:在.NET中,存在“nullability”的概念,与之相关的是XML中的可为空元素,它们由xml:nil属性标记。XmlArrayAttribute.IsNullable属性控制的正是这一点。
默认情况下,IsNullable属性为false,或者将其移除,这样“delete”元素就不会被发出。但这仅适用于集合为空的情况。
那么,如何通过属性来控制当集合为空时不发出“delete”元素呢?事实上,这就是提问者的问题。
以下是一个可能的解决方法:
[XmlArray(IsNullable = true)] // 设置IsNullable属性为true [XmlArrayItem("item")] public List<string> Items { get; set; }
通过设置IsNullable属性为true,即可实现当集合为空时不发出“delete”元素。
希望这个解决方法能对你有所帮助!