WCF 确保存在必要的枚举值

Posted

技术标签:

【中文标题】WCF 确保存在必要的枚举值【英文标题】:WCF ensure that the necessary enum values are present 【发布时间】:2018-01-26 10:35:08 【问题描述】:

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

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 属性进行标记。

我现在不能去更改所有枚举,因为我们有一个庞大的项目,替换它们太多了,而且用新的属性替换我们所有的服务合同也太多了。

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

【问题讨论】:

您是否使用[DataMember] 属性标记了枚举的每个实例? @ste-fu 我正在尝试序列化不存在的枚举值表示的成员 抱歉 - 我有点困惑 - 你如何期望转换为一个不存在的值才能完全停止? @ste-fu c# 允许将任何基于 int 的枚举强制转换为 int 值枚举,因此我想重写序列化程序以将所有枚举强制转换为它们的 int 值,并且当它们被反序列化时在这种情况下被强制转换回枚举,就像这样 (DeleteMe)2 如果要接受未知值,为什么还要使用枚举?如果您需要一些东西来更轻松地管理枚举中的更改,请考虑T4。 【参考方案1】:

一旦您的应用程序发布,就没有很好的方法来处理这个问题。不过,如果你提前计划好情况,是可以应付的。

所以对于上面的例子,你可以这样做:

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; 

【讨论】:

以上是关于WCF 确保存在必要的枚举值的主要内容,如果未能解决你的问题,请参考以下文章

将单个枚举值传递给 WCF 服务时,protobuf-net 引发有关无效线路类型的异常

Go 返回值命名还有存在的必要吗?

在 WCF 数据服务中使用枚举

WCF 客户端的默认属性值

WCF / WCF 数据服务 / WCF RIA 服务

枚举类型enum