XmlSerialize一个Enum Flag字段

Chr*_*ove 11 c# xml-serialization .net-4.0

我有这个 :

    [Flags]
    public enum InfoAbonne{civilite,name,firstname,email,adress,country }

    public class Formulaire
    {
      private InfoAbonne _infoAbonne{ get; set;}
      public Formulaire()
      {}
    }
Run Code Online (Sandbox Code Playgroud)

我想要Xml序列化Formulaire

如果我初始化:
_infoAbonne = InfoAbonne.name | InfoAbonne.email;

在我的Xml结果中我只得到:

<InfoAbonne>email</InfoAbonne>
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 15

即使您将Flags属性添加到枚举中,仍需要确保值为2的幂:

[Flags]
public enum InfoAbonne
{
    civilite = 1,
    name = 2,
    firstname = 4,
    email = 8,
    adress = 16,
    country = 32
}
Run Code Online (Sandbox Code Playgroud)

请参阅文档 " 备注"部分中列出的准则.


Dr.*_*ABT 8

这些问题的基本思想是序列化一个模拟你想要序列化的字段的后备字段.相同的原则可以应用于复杂类型,如位图等...例如,您可以序列化int类型的支持字段,而不是直接序列化Enum字段:

// Disclaimer: Untested code, both in execution and compilation
[Flags]      
public enum InfoAbonne 
{
    civilite = 0x1, // Increment each flag value by *2 so they dont conflict
    Name=0x2,
    firstname=0x4,
    email=0x8,
    adress=0x10,
    country=0x20 
}  

// Don't serialize this field
[XmlIgnore]
private InfoAbonne _infoAbonne { get; set;} 

// Instead serialize this field as integer
// e.g. name | email will equal 0xA in hex, or 10 in dec
[XmlElement("InfoAbonne")]
private InfoAbonneSerializer 
{ 
    get { return (int)_infoAbonne; } 
    set { _infoAbonne= (InfoAbonne) value; } 
} 
Run Code Online (Sandbox Code Playgroud)

最好的祝福,