枚举没有在WCF中序列化

时间:2014-03-09 21:22:50

标签: c# web-services wcf

我遇到了在我的WCF应用程序中序列化枚举的问题。

我有一个类Account,它继承自如下定义的接口IAccount

namespace MyNamespace
{
   public interface IAccount
   {
      public string FirstName { get; set; }
      public string LastName { get; set; }
      public string EmailAddress { get; set; }
      public Country Country { get; set; }
   }
}

继承自Account的{​​{1}}类定义为:

IAccount

}

国家namespace MyNamespace { [DataContract] public Account : IAccount { [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } [DataMember] public string EmailAddress { get; set; } [DataMember] public Country Country { get; set; } } } 如下:

Enum

}

在客户端创建namespace MyNamespace { public enum Country { America = 1, England = 2, France = 3 } 对象并调用用Account修饰的方法AddAccount将Account对象序列化为:

OperationContract

您会注意到<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <AddAccount xmlns="http://tempuri.org/"> <account> <FirstName xmlns="http://schemas.datacontract.org/2004/07/MyNamespace">MyFirstName</FirstName> <LastName xmlns="http://schemas.datacontract.org/2004/07/MyNamespace">MyLastName</LastName> <EmailAddress xmlns="http://schemas.datacontract.org/2004/07/MyNamespace">MyEmail@gmail.com</EmailAddress> </account> </AddAccount> </soap:Body> </soap:Envelope> 枚举未被序列化。

我尝试过使用DataContract和EnumMember修饰枚举,甚至在DataContracts的属性值中显式设置名称空间甚至为EnumMember属性设置值,但似乎没有任何效果。

我不知道自己是疯了还是错过了一些非常明显的东西,或者我还需要做些什么,而这些不是上述代码的一部分。

更新

在将WCF应用程序添加为Web引用后,查看在客户端生成的代理类,我注意到枚举不像其他属性那样用Country进行修饰。

3 个答案:

答案 0 :(得分:8)

您需要使用以下合同信息来装饰您的枚举:

  [DataContract]
  public enum Country
  {
    [EnumMember]
    America = 1,
    [EnumMember]
    England = 2,
    [EnumMember]
    France = 3
  }

然后在您的服务合同上添加:

[ServiceContract]
[ServiceKnownType(typeof(Country))]
public interface IMyService {
// etc..
}

答案 1 :(得分:1)

枚举应使用DataContractEnumMember属性进行修饰。您还可以将引用您的枚举的ServiceKnownType属性添加到服务合同中。

[DataContract]
public enum Country
{
   [EnumMember]
   America = 1,
   [EnumMember]
   England = 2,
   [EnumMember]
   France = 3
}

但总的来说,我建议避免在服务中使用枚举,因为它会导致潜在的向后兼容性问题。这是一个问题和一个很好的答案,解释了这个Do you use enum types in your WCF web services?

答案 2 :(得分:0)

我有一个类似的问题。这些属性也没有帮助我。

首先,对于枚举,如果您不以某种方式未设置其枚举,则默认值为0。并且,如果您未使用0值定义成员,则WCF不会序列化枚举。

所以我建议在您的枚举中添加一个值为0的成员。

[DataContract]
public enum Country
{
   [EnumMember]
   None = 0,
   [EnumMember]
   America = 1,
   [EnumMember]
   England = 2,
   [EnumMember]
   France = 3
}