Можно ли определить использование битов в контракте данных службы WCF?

#c# #c #wcf #datacontract #wcf-serialization

Вопрос:

У меня есть программа на C с типичным режимом int , в котором используется битовая маска. Эта битовая маска определена в перечислении, подобном этому:

 enum EModeEntryPoint
{
    // Mode
    entryPointNone              =0x00,
    entryPointNormal            =0x01,
    entryPointExistingAddress   =0x02,
    entryPointNewAddress        =0x04,
    entryPointNewAndExisting    =0x06,  
    entryPointOnlyNewTickets    =0x08,  
};
 

Когда я использую перечисление в службе C# WCF, как это

 [DataContractAttribute]
public enum ModeEntryPoint
{
    // Mode
    [EnumMember] None              =0x00,
    [EnumMember] Normal            =0x01,
    [EnumMember] ExistingAddress   =0x02,
    [EnumMember] NewAddress        =0x04,
    [EnumMember] NewAndExisting    =0x06,  
    [EnumMember] OnlyNewTickets    =0x08,  
};
 

Я вижу, что значения, которые я здесь определяю, не используются. Я вижу, что такие перечисления всегда «перенумерованы».

Можно ли где-либо определить такое использование битов в контракте?

Создание поля bool для каждого бита-это не то, что мне нравится. Также это раздувает блок данных.

Комментарии:

1. вы хотите использовать DataContract или DataContractAttribute ?

2. Я думаю, что вы должны указывать значения перечисления, например [EnumMember(Value="ExistingAddress")]

3. @MatthewWatson Спасибо. Я посмотрю на это!

4. также: если это биты: подумайте о том, чтобы пометить перечисление [Flags] ; также может быть полезно рассмотреть None = 0 , Normal = 1 << 0 , ExistingAddress = 1 << 1 , NewAddress = 1 << 2 , NewAndExisting = NewAddress | ExistingAddress

5. Может быть, вы сможете взглянуть на документы и найти какое-то решение.

Ответ №1:

Ключевое слово [Flags] — это решение.

 [DataContractAttribute][Flags]
public enum ModeEntryPoint
{
    // Mode
    [EnumMember] None = 0x00,
    [EnumMember] Normal = 0x01,
    [EnumMember] ExistingAddress = 0x02,
    [EnumMember] NewAddress = 0x04,
    [EnumMember] 
    NewAndExisting = ExistingAddress| NewAddress,  
    [EnumMember] OnlyNewTickets = 0x08,  
};
 

Это позволяет клиенту WCF удалять определенные поля этого типа.