XML序列化和空集合

7 浏览
0 Comments

XML序列化和空集合

我有一个属性定义如下:

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

如果List<> Delete没有任何项,则会生成。如果List<> Delete设置为null,则会生成。是否有一种使用属性的方法,使得如果集合中没有任何项,delete元素不会被生成?

Greg - 完美,谢谢!我甚至没有阅读IsNullable的文档,只是假设它表示不是必需的。

Rob Cooper - 我试图避免使用ISerializable,但Greg的建议有效。我确实遇到了你在(1)中提到的问题,如果集合长度为零,只返回null会导致我破坏了很多代码。为了解决这个问题,我创建了一个EventsBuilder类(我要序列化的类名为Events),它管理了Events类的所有生命周期/创建,以便为序列化生成Events类的实例。

0
0 Comments

XML序列化和空集合

首先,我会问你自己“什么是序列化?”。

XmlSerializer正在做它应该做的事情,将对象的当前状态持久化为XML。现在,我不确定为什么当前的行为对你来说不是“正确”的,因为如果你已经初始化了List,那么它是已经初始化的。

我认为你在这里有三个选项:

1. 在Getter中添加代码,如果集合中没有任何项,则返回null。但这可能会破坏你已有的其他代码。

2. 实现IXmlSerializable接口,并自己完成所有工作。

3. 如果这是一个常见的过程,那么你可能想看一下我的问题“XML序列化和继承类型”-是的,我知道它涉及到另一个问题,但它向你展示了如何创建一个通用的中介序列化类,然后可以“附加”它以允许封装序列化过程。你可以创建一个类似的类来处理覆盖默认过程以处理null/零项集合。

希望对你有所帮助。

0
0 Comments

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”元素。

希望这个解决方法能对你有所帮助!

0