2011-04-28 129 views
3

我在C#序列化对象到XML,我想序列化C#XML序列化

public String Marker { get; set; } 

<Marker></Marker> 

当串标记没有价值。

现在,我得到

<Marker /> 

Marker == string.Emptynull没有标记的节点。 我怎样才能得到这个?

+3

我想你应该展开你为什么要这样做。在语义上,这两种形式没有区别,所以如果你正在编写一个不可互换的系统,它会混淆将来看它的任何人(包括你自己)。 – Aidan 2011-04-28 10:33:00

+0

你为什么要在乎元素是简短的还是扩展的?它不会改变意思... – 2011-04-28 10:33:00

+0

只是你喜欢''表示更好还是有技术原因?它几乎从来没有区别(实际上,只有HTML'

-1

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

尽管如此,还没有想出如何为没有任何价值的元素生成开启和关闭元素。你已经是完全合法的XML。也就是说,

<Marker></Marker> 

相同

<Marker/> 

真的需要开启和关闭标签?

+0

不幸的是......只在扩展表单中除了服务器端的解析器。较短的表单会返回一个错误,但是当我手动发送扩展表单时,它就像一个魅力一样。 – Jonah 2011-04-28 10:51:54

+0

因此,在您编写文件以通过循环遍历文件来替换具有扩展表单的所有较短表单的解决方案。 – 2011-04-28 11:31:39

+0

这是一个好主意。如果没有更快的解决方案出现,我会称之为我的紧急计划。 – Jonah 2011-04-28 11:44:34

0

如果您想拥有结束标签,您必须更改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,你会得到:

<ClassToSerialize><Marker></Marker></ClassToSerialize> 

我希望这有助于!

+0

好主意,但是当我序列化'ClassToSerialize'时,我得到' '。不过谢谢。 – Jonah 2011-04-28 11:30:32

+0

不,这是不正确的,因为Marker被表示为一个单独的类(顺便说一下,这个单独的类可以重用于需要遵循相同模式的其他字符串属性) – 2011-04-28 11:33:02