是否可以在 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 = 0
、Normal = 1 << 0
、ExistingAddress = 1 << 1
、NewAddress = 1 << 2
、NewAndExisting = 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 组织服务 - 直接自定义绑定?