我遇到了在我的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
进行修饰。
答案 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)
枚举应使用DataContract
和EnumMember
属性进行修饰。您还可以将引用您的枚举的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
}