2013-03-27 29 views
1

我需要反序列化在C#中的流動XML的XML元素反序列化,可能是不同類型的

<Show> 
    <status>Canceled</status> 
</Show> 

<Show> 
    <status>2</status> 
</Show> 

我的課是

[XmlRoot("Show")]` 
public class Show 
{ 
    [XmlElement(ElementName = "status")] 
    public object status { get; set; } 
} 

和它的作品,但我想它反序列化到枚舉在這個例子中取消等於2

public enum ShowStatus 
{ 
    [XmlEnum("Canceled")] 
    Canceled = 2 
} 

有沒有辦法做到這一點,而不解析public object status { get; set; }字符串值枚舉

回答

1

如果你想使用的名稱或整數DeserializeEnum可以裝點EnumXmlEnum屬性和供應整數。

這將反序列化「已取消」和「2」作爲您的Enum。

例子:

[XmlRoot("Show")] 
public class Show 
{ 
    [XmlElement(ElementName = "status")] 
    public ShowStatus status { get; set; } 
} 

public enum ShowStatus 
{ 
    [XmlEnum("2")] 
    Canceled = 2 
} 

測試XML:

<?xml version="1.0"?> 
<ArrayOfShow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Show> 
    <status>Canceled</status> 
    </Show> 
    <Show> 
    <status>2</status> 
    </Show> 
</ArrayOfShow> 
0

您不能直接使用object,XmlSerializer只是拒絕使用泛型。對象仍然有一個基礎類型,當它的反序列化時,你不知道該類型是什麼。我爲它做了一個解決方法here但它不是很漂亮,或非常有用。

您可以自定義執行IXmlSerializable,但這是一個頭痛的一半。

我假設問題的根源是您將其作爲來自其他來源的輸入,並且該字段可以是整數或文本,您希望將其存儲爲可枚舉。您可能會更好地將它反序列化爲一個字符串,然後再簡單地解析它。這可能是最簡單的方法。我能找到的其他東西都是反序列化字符串值,或者只是整數值,我不知道它們中的任何一個是否可以處理這兩種形式的數據,但似乎不太可能。

This Function可能會幫助你很多,它看起來像它可以處理字符串或數值,但我不認爲XmlSerializer可以使用它。你最好用一個字符串「dummy」,它可以使用Parse函數保存回Enum屬性。有關虛擬屬性的示例,請參見this stackoverflow question

一般來說它會是這個樣子:

[XmlRoot("Show")]` 
public class Show 
{ 
    [XmlIgnore()] 
    public ShowStatus status { get; set; } 

    [XmlElement(ElementName = "status")] 
    public string StatusString 
    { 
     get { return status.ToString(); } 
     set { status = Enum.Parse(ShowStatus, value); } 
    } 
} 
+0

感謝名單,我會做到這一點 – 2013-03-27 22:48:21

+0

@Nevyn,你可以處理兩種類型的數據(字符串,整數),默認情況下,XmlSerializer的反序列化會該枚舉的字符串表示形式,但是如果要反序列化枚舉的int值,則可以使用'XmlEnum'並提供int值,現在它將處理字符串和整型值。 – 2013-03-27 23:03:14

+0

@ sa_ddam213華友世界爲過度複雜但仍然可用的解決方案:-)。我其實並不知道它會將它們反序列化爲相同的枚舉。我確實知道序列化它們只會產生一個或另一個。*聳肩*好 – Nevyn 2013-03-27 23:16:35

相關問題