2012-03-30 109 views
12

是否有可能反序列化從int的枚舉在c#中。例如如果我有下面的類:C#從整數反序列化枚舉

class Employee 
{ 
    public string Name { get; set;} 
    public int EmployeeTypeID { get; set;} 
} 

我可以很容易地從XML

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>1</EmployeeTypeID> 
    </Employee> 

使用像這樣創造的:

Employee employee = (Employee)new XmlSerializer(typeof(Employee)).Deserialize(XmlReader); 

由於涉及很少的工作,這讓我使用一個通用的服務,我可以使用所有的數據庫對象,通過提供一個選擇命令,連接字符串和一個類型,並檢索一個對象數組,無需進一步映射。不過,我已經與枚舉脫鉤了。現在假設,而不是作爲一個整數EmployeeType是一個枚舉:

public enum EmployeeTypeEnum 
{ 
    Admin = 1, 
    Sales = 2 
} 

所以我的課就變成了:

class Employee 
{ 
    public string Name { get; set;} 
    public EmployeeTypeEnum EmployeeTypeID { get; set;} 
} 

我可以使用相同的XML,讓C#認識到EmployeeTypeID在XML的int值應該與枚舉的int值一致嗎?還有其他類似的問題,但沒有一個有非常滿意的答案,而且涉及批量更改代碼。我希望有更好的解決方案...

作爲一個可能的單獨的註釋(並稍微預期一些響應),是否使用枚舉爲此練習最好的避免?我應該使用鍵值對嗎?如果有可能發生變化,我總是使用鍵值對(或類似的),但在這種情況下,EmployeeType是固定的並且永遠不會改變。

+1

+1 - 我遇到的那些問題之一,我不能證明太多用途,但期待看到答案。 – SkonJeet 2012-03-30 14:05:43

+2

是否http://stackoverflow.com/questions/506368/how-do-i-serialize-an-enum-value-as-an-int幫助? – Bridge 2012-03-30 14:08:24

+0

或http://stackoverflow.com/questions/4250656/deserializing-enums? – kerrubin 2012-03-30 14:09:59

回答

18

理論上(=我還沒有嘗試過),加入XmlEnum屬性的枚舉值應該做的伎倆:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] Admin = 1, 
    [XmlEnum("2")] Sales = 2 
} 

這告訴XmlSerializer的是EmployeeTypeEnum.Admin的值是序列化爲字符串1,反之亦然(這是你需要的)。

關於你的側面說明:我沒有看到使用枚舉這裏是一個問題。如果數據庫中的值是整數並且具有固定含義,則枚舉是一個很好的解決方案,此外還可以作爲數據庫值的文檔。

3

如果XML是格式爲:

<Employee> 
    <Name>Shiv</Name> 
    <EmployeeTypeID>Sales</EmployeeTypeID> 
</Employee> 

它將工作原樣。如果用XmlEnum將屬性裝飾你的枚舉,如下所示:

public enum EmployeeTypeEnum 
{ 
    [XmlEnum("1")] 
    Admin = 1, 
    [XmlEnum("2")] 
    Sales = 2 
} 

然後你就可以在你的XML文件中使用整數值,他們將被自動地映射到枚舉。

就個人而言,我更喜歡在這種情況下使用枚舉。即使枚舉中的項目可能會隨着時間的推移而增加,我更喜歡使用枚舉。事實上,這樣的枚舉是從數據庫生成的代碼,所以在代碼中你不能使用Ids(更可讀)。

0

在xml文件中,使用命名常量而不是整數值。它會工作得很好。

<Employee> 
     <Name>Joe Bloggs</Name> 
     <EmployeeTypeID>Admin</EmployeeTypeID> 
</Employee>