2013-07-10 78 views
2

我有以下DataContract:注意:我没有更改DataContract的权限。我只参考它。反序列化c#datacontract枚举时出错

[Serializable] 
[DataContract] 
public class Client 
{ 
    public Client(); 
[DataMember] 
public string Name { get; set; } 
[DataMember] 
public List<Contact> Contacts { get; set; } 
} 

而在联系人:

[Serializable] 
[DataContract] 
public class Contact 
{ 
     public Contact(); 
[DataMember] 
public string ContactName { get; set; } 
[DataMember] 
public ContactTypes ContactType { get; set; } 
} 

的ContactTypes是一个枚举:

[Serializable] 
[DataContract] 
public enum ContactTypes 
{ 
    [EnumMember(Value="Phone")] 
    Phone = 1, 

    [EnumMember(Value="Mail")] 
    Mail = 2 
} 

我的问题是,当我反序列化我的XML。它显示错误:无效的枚举值“1”无法反序列化。

这里是我的xml:

<Clients> 
<Client> 
     <Name>Firstname</Name> 
     <Contacts> 
      <Contact> 
       <ContactName>ContactName</ContactName> 
       <ContactType>1</ContactType> 
      </Contact> 
     </Contacts> 
</Client> 
</Clients> 

难道我错过了什么吗?我一整天都在讨论这个问题。谢谢您的帮助!

回答

2

默认情况下,数据协定包含枚举成员名称,而不是数值。在使用数据合同模型时,如果接收方是WCF客户端,则导出的模式会保留数字值。

这只简单的方法来解决它改变datacontract以这种方式现在

[Serializable] 
[DataContract] 
public enum ContactTypes 
{ 
    [EnumMember(Value="1")] 
    Phone = 1, 

    [EnumMember(Value="2")] 
    Mail = 2 
} 

,如果你不能编辑datacontract,你可能有一个很大的问题......

我假设发送方没有使用WCF(为什么锁定datacontract?为什么会出现错误的定义?),并且使用正确的数据协定模型非常重要:它不适用于xml文件。

+0

事实是,我可以编辑datacontract,但仅限于本地端。我想我会给这个镜头。 – Gerald