【问题标题】:Enum not getting serialized in WCF枚举未在 WCF 中序列化
【发布时间】:2014-03-09 21:22:50
【问题描述】:

在我的 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; }
   }
}

继承自IAccountAccount类定义为:

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 对象并调用用OperationContract 修饰的方法AddAccount 将Account 对象序列化为:

<?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>

您会注意到Country 枚举没有被序列化。

我已经尝试了所有方法,从使用 DataContract 和 EnumMember 装饰枚举,甚至在 DataContracts 的属性值中显式设置命名空间,甚至为 EnumMember 属性设置值,但似乎没有任何效果。

我不知道我是不是发疯了,错过了一些非常明显的东西,还是我需要做的其他事情不是上面代码的一部分。

更新:

查看添加 WCF 应用程序作为 Web 引用后在客户端生成的代理类,我注意到枚举没有像其他属性那样用 [System.Xml.Serialization.XmlElementAttribute(IsNullable = true)] 修饰。

【问题讨论】:

  • 不要在 WCF 服务中使用枚举类型。

标签: c# web-services wcf


【解决方案1】:

您需要用一些合同信息来装饰您的枚举,例如:

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

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

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

【讨论】:

  • 不起作用 :( 请参阅我上面关于 XML 属性的更新。也许我还需要在配置中做其他事情?
  • 没有收到错误。枚举未序列化,因此在服务器端设置为默认值 0。
【解决方案2】:

枚举应使用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?

【讨论】:

    【解决方案3】:

    我遇到了类似的问题。这些属性也没有帮助我。

    首先,对于枚举,如果您不设置它的值,默认值为 0。如果您没有定义具有 0 值的成员,WCF 将不会序列化您的枚举。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2017-07-16
      • 2011-05-07
      相关资源
      最近更新 更多