C#xml序列化

我在c#中将对象序列化为xml,我想序列化

public String Marker { get; set; } 

  

当字符串标记没有值时。

现在我明白了

  

for Marker == string.Empty ,没有标记节点为null 。 我怎么能得到这个?

如果Marker属性为null,则可以轻松地禁止元素。 只需添加一个ShouldSerializeMarker()方法:

 public bool ShouldSerializeMarker() { return Marker != null; } 

它将由XmlSerializer自动调用,以决定是否在输出中包含该元素。

至于在字符串为空时使用元素的扩展forms,没有简单的方法(你可以编写自己的XmlWriter ,但这会很痛苦)。 但无论如何它没有意义,因为具有完全相同的含义。

如果要使用结束标记,则必须更改xml结构的实现; 据我所知,这个序列化主题只有在序列化一个“复杂”对象(例如:一个类)而不是一个“简单”对象(例如:一个字符串)时才会生成单独的结束标记。

一个例子是:

 [XmlRoot] public class ClassToSerialize { private StringWithOpenAndClosingNodeClass mStringWithOpenAndClosingNode; [XmlElement] public StringWithOpenAndClosingNodeClass Marker { get { return mStringWithOpenAndClosingNode ?? new StringWithOpenAndClosingNodeClass(); } set { mStringWithOpenAndClosingNode = value; } } } [XmlRoot] public class StringWithOpenAndClosingNodeClass { private string mValue; [XmlText] public string Value { get { return mValue ?? string.Empty; } set { mValue = value; } } } 

如果将此对象序列化为XML,您将获得:

  

我希望这有帮助!

您可以使用XMLElementAttributeIsNullable属性来配置XmlSerializer以为您的null值生成XML。

但是,没有想出如何为没有价值的元素生成一个开始和结束元素。 你已经拥有完全合法的XML。 那是,

  

是相同的

  

真的需要开关标签吗?