你怎么能让一个标志枚举在C#中以数值方式序列化它的组合值?

问题描述:

假设在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

系列化开箱允许保存和恢复已检举枚举值:

<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

最简单的方法是只创建一个单独的int属性序列化。

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

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