2017-10-10 36 views
0

假設在C#中的標誌枚舉:你怎麼能讓一個標誌枚舉在C#中以數值方式序列化它的組合值?

[Flags] 
public enum FlagsEnum 
{ 
    One = 0x1, 
    Two = 0x2, 
    Four = 0x4, 
    ... 
} 

如果您通過標準的JSON或XML序列化運行此,FlagsEnum.One將被序列化爲字符串OneFlagsEnum.TwoTwo等,如果你想改變它要將值序列化爲整數1,2等,枚舉的一般解決方案通常是使用EnumMember屬性或XmlEnum屬性。

問題是,使用一個標誌枚舉,你期望使用的幾個數值不是專門聲明的。谷歌搜索似乎並沒有爲這種情況提供很多解決方案。那麼你如何得到像這樣的東西被序列化爲不僅僅是2的冪的整數值,而是以序列化形式顯示的東西,如23,15等等。

編輯

部分就是我正在尋找的是在枚舉本身內指定這個,不會增加任何枚舉值額外的屬性或其他類型的一種方式。然而,在我的腦海裏有一個問題,這是否實際上是可能的(基本上來說)。

此外,目前真正想出的串行器的主要類型是DataContractSerializer。然而,典型的標準JSON內容也適用於這個問題,目標是避免更改序列化程序本身以及使用任何客戶或離線路徑。 (屬性和東西將是一件好事,如果能夠做到這一點的方式)

+1

唯一可能的方式做到這一點因爲沒有額外的屬性枚舉的一部分等是否附着某種暗示系列化屬性的財產,或設置爲串行一些配置。這取決於你使用的序列化器(例如'DataContractJsonSerializer'和Json.Net'JsonSerializer')。你在做什麼序列化? – Rhumborl

+1

您可能正試圖解決您不需要解決的問題。只要你的枚舉標有'[Flags]','XmlSerializer'和Json.NET都會正確串行化位掩碼值。請參閱https:// dotnetfiddle。net/SBSPWY,它表明生成的XML將是' One Two Four',JSON將會是''一,二,四''。 – dbc

+0

@dbc是完全正確的,只需再次檢查序列化 – ASpirin

回答

2

系列化開箱允許保存和恢復已檢舉枚舉值:

<foo>Two Four</foo> 

但字符串值在XML

將其保存爲INT解釋就可以使一個int屬性和序列化,而不是

[XmlIgnore] 
public FlagsEnum foo{get;set;} 
public int bar 
{ 
    get{ return (int)foo;} 
    set{ foo = (FlagsEnum)value;} 
} 

在這種情況下,你的XML將有一個整型值和對象將甲肝Ë全枚舉數據

DataContractSerializerXmlSerializer可與IXmlSerializable接口實現的一個選項,但它是一個有點太過剩了大類

public void ReadXml(XmlReader reader) 
{ 
    while (reader.Read()) 
    { 
     if (reader.Name == "foo") 
     { 
      foo = (FlagsEnum)reader.ReadElementContentAsInt(); 
     } 
    } 
} 

public void WriteXml(XmlWriter writer) 
{ 
    writer.WriteElementString("foo", ((int)foo).ToString()); 
} 
+0

在枚舉本身中沒有辦法指定它? – Panzercrisis

+1

不要在枚舉中出現這樣的事情,這可能在串行器中,它依賴於序列化器。例如。你可以重寫序列化爲XMl中的int。 – ASpirin

1

最簡單的方法是隻創建一個單獨的int屬性序列化。

public class DTO 
{ 
    [JsonIgnore] 
    public FlagsEnum Prop1 { get; set; } 

    public int Prop1Serialize { 
     get { return (int)Prop1; } 
     set { Prop1 = (FlagsEnum)value; } 
    } 
}