WCF确保存在必要的枚举值

问题描述 投票:0回答:1

我正在尝试序列化可能尚不存在的枚举值。我有一个现有的项目,在我们的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?

c# wcf serialization enums
1个回答
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; }
}
© www.soinside.com 2019 - 2024. All rights reserved.