WCF确保存在必要的枚举值

时间:2017-08-17 20:55:14

标签: c# wcf serialization enums

我试图序列化可能尚不存在的枚举值。 我有一个现有的项目,在我们的datacontract中有几个枚举,为了简单起见我显示如下:

public partial class TestDTO : ITestDTO
{
    public DeleteMe DeleteMeEnum { get; set; }
}

[DataContract]
public enum DeleteMe 
{
    [EnumMember]
    Deleted = 0,
}

我们的应用程序有一个隐藏的内部wcf层,我们的公共Web api访问它。示例服务合同如下:

[ServiceContract]
public interface ITestService
{
    [OperationContract]
    TestDTO GetTestDTO();
}

public class TestService : ITestService
{
    public TestDTO GetTestDTO()
    {
        return new TestDTO() { DeleteMeEnum = (DeleteMe)2 };
    }
}

当我从WebApi调用此方法时,显然我得到了经典错误:

  

枚举价值' 2'类型' DeleteMe'无效并且无法序列化。确保存在必要的枚举值,并且如果类型具有DataContractAttribute属性,则使用EnumMemberAttribute属性标记。

我现在无法改变所有的枚举,因为我们有一个大型项目,更换它们太多了。用新的Attibute替换我们所有的服务合同也会太多。

有没有人知道我可以全局解决这个问题的方法,例如用自定义XMLSerializer替换默认的XMLSerializer?

1 个答案:

答案 0 :(得分:0)

发布应用程序后,没有一种很好的方法来处理此问题。但是,如果您提前计划好情况,则可以解决。

因此对于上面的示例,您可以执行以下操作:

public partial class TestDTO : ITestDTO
{
    [DataMember(Name = "DeleteMeEnum")]
    private string DeleteMeEnumString 
    {
         get { return DeleteMeEnum.ToString(); }
         set {
              DeleteMe _enum;
              if (!Enum.TryParse(value, out _enum))
              {
                  _enum = <default value>;
              }
              DeleteMeEnum = _enum;
         }
    }   

    [IgnoreDataMember]
    public DeleteMe DeleteMeEnum { get; set; }
}