【问题标题】:WCF ensure that the necessary enum values are presentWCF 确保存在必要的枚举值
【发布时间】: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

标签: c# wcf serialization enums


【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多