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 确保存在必要的枚举值的主要内容,如果未能解决你的问题,请参考以下文章