2011-04-28 118 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