是否可以在 WCF 服务的 DataContract 中定义位的使用?

Posted

技术标签:

【中文标题】是否可以在 WCF 服务的 DataContract 中定义位的使用?【英文标题】:Is it possible to define the usage of bits in the DataContract of a WCF service? 【发布时间】: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 并找到一些解决方案。 【参考方案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 客户端解码此类型的特定字段。

【讨论】:

以上是关于是否可以在 WCF 服务的 DataContract 中定义位的使用?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 httpwebrequest 使用 WCF 服务(托管为 Windows 服务托管)?

是否可以创建 WCF 服务端点来处理来自 Azure 服务总线的死信?

是否可以在没有 SDK 的情况下调用 Dynamics CRM 2011 后期绑定 WCF 组织服务 - 直接自定义绑定?

是否可以使用 jQuery 方法 getJSON 跨域将复杂对象传递给 WCF 服务?

是否可以强制 WCF 测试客户端接受自签名证书?

wcf 数据服务是不是可以返回 json 格式的元数据?