【问题标题】:DataContract issue in WCFWCF 中的 DataContract 问题
【发布时间】:2009-06-13 17:24:44
【问题描述】:

假设我有一个方法并且返回类型是枚举,我的问题是我应该将枚举声明为 DataContract 吗?

样例中,OrderStatus 是一个枚举数据类型,

OrderStatus Poll(string queryID);

我应该将 OrderStatus 枚举类型声明为 DataContract 吗?

提前致谢, 乔治

【问题讨论】:

    标签: c# wcf enums datacontract


    【解决方案1】:

    我认为您不需要将 OrderStatus 声明为 DataContract。根据我的经验,如果 Enums 被作为合同一部分的另一个类使用,它们会自动被合同化。

    此外,还有一个 [EnumMember] 属性,可让您选择要通过合同公开的枚举值,如果您出于某种原因不想公开所有枚举值。

    【讨论】:

    • 酷!关于“如果枚举被作为合同一部分的另一个类使用,它们会自动被合同化。” - 我已经从客户端代理代码测试过,这是真的。但是我没有找到任何正式的WCF文件提到这一点,这就是我来这里询问的原因。你有什么好的文件要分享吗?
    【解决方案2】:

    您需要将[EnumMember] 等添加到枚举的唯一情况是:

    • 您不希望它们全部暴露(请参阅 Pwninstein 的回答)
    • 出于兼容性原因,您想更改线路上的文本(设置Value)。

    MSDN 有后者的例子。

    【讨论】:

    • 那么,如果我想通过WCF暴露枚举类型的所有状态,是否不需要将DataContract添加到枚举中?
    • 正确。我从来不需要添加它;-p
    【解决方案3】:

    如果您希望使用适当的 xsd 命名空间发布您的 wsdl,您只能使用枚举的 DataContract 属性来执行此操作。

    例如

    [Datacontract(Namespace="http://company/xsd/service/2009/07/03"]
    public enum Status
    {
    [EnumMember]
    ERROR = 1,
    [EnumMember]
    GOOD = 2,
    }
    

    否则在 wsdl 中使用默认命名空间。对于企业 Web 服务,您可能希望有适当的名称空间和版本控制您的 wsdl 模式。同样使用 EnumMember 属性,您可以选择不发布上述所有枚举值。

    【讨论】:

      【解决方案4】:

      我以前不需要回答这个问题,但您似乎可以通过创建一个简单的小测试项目并尝试两种方式自己找到答案。选择可以为您提供所需结果的方法。 (你的帖子并没有真正表明目标,所以无论如何都很难回答这个问题。)

      【讨论】:

      • 我的目标是把OrderStatus声明为Datacontract是否正确。我测试过,声明和不声明似乎没有区别,如果我错了,请随时纠正我。
      • 那听起来像是一个答案。如果这两种情况都满足你的目标,那么你不需要添加额外的代码。
      【解决方案5】:

      当您在对 Pwninstein 回答的评论中要求提供文件时,我将其张贴在此处。

      http://msdn.microsoft.com/en-us/library/aa347875.aspx

      它说(在简单枚举部分):

      您还可以序列化尚未应用 DataContractAttribute 属性的枚举类型。此类枚举类型的处理方式与前面描述的完全相同,除了每个成员(未应用 NonSerializedAttribute 属性)都被视为已应用 EnumMemberAttribute 属性。

      希望对你有帮助:D

      【讨论】:

        猜你喜欢
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多