【问题标题】:Is it possible to define the usage of bits in the DataContract of a WCF service?是否可以在 WCF 服务的 DataContract 中定义位的使用?
【发布时间】:2021-11-27 08:00:45
【问题描述】:

我有一个使用位掩码的典型模式int 的 C++ 程序。这个位掩码在这样的枚举中定义:

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,  
};

我可以看到我在这里定义的值没有被使用。我可以看到这样的枚举总是被“重新编号”。

是否可以在任何地方的合约中定义这样的比特使用?

为每个位创建一个布尔字段不是我喜欢的。它还会使数据块膨胀。

【问题讨论】:

  • 你想使用DataContract还是DataContractAttribute
  • 我认为您应该指定枚举值,例如[EnumMember(Value="ExistingAddress")]
  • @MatthewWatson 谢谢。我会看看这个!
  • 另外:如果这些是位:考虑用[Flags]标记枚举;考虑None = 0Normal = 1 << 0ExistingAddress = 1 << 1NewAddress = 1 << 2NewAndExisting = NewAddress | ExistingAddress 也可能有用
  • 也许你可以看看the docs 并找到一些解决方案。

标签: c# c++ wcf datacontract wcf-serialization


【解决方案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 客户端解码此类型的特定字段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2012-01-05
    • 1970-01-01
    相关资源
    最近更新 更多