C# WCF确保存在必要的枚举值
我正在尝试序列化可能还不存在的枚举值。 我有一个现有的项目,在我们的datacontract中有几个枚举,为了简单起见,我显示了一个这样的枚举:C# WCF确保存在必要的枚举值,c#,wcf,serialization,enums,C#,Wcf,Serialization,Enums,我正在尝试序列化可能还不存在的枚举值。 我有一个现有的项目,在我们的datacontract中有几个枚举,为了简单起见,我显示了一个这样的枚举: public partial class TestDTO : ITestDTO { public DeleteMe DeleteMeEnum { get; set; } } [DataContract] public enum DeleteMe { [EnumMember] Deleted = 0, } 我们的应用程序有一
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?一旦应用程序发布,就没有好的方法来处理这个问题。然而,如果你提前计划好情况,它是可以处理的 因此,对于上面的示例,您可以这样做:
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; }
}
公共部分类TestDTO:ITestDTO
{
[DataMember(Name=“DeleteMeEnum”)]
私有字符串DeleteMeEnumString
{
获取{return DeleteMeEnum.ToString();}
设置{
DeleteMe _enum;
如果(!Enum.TryParse(值,out_Enum))
{
_枚举=;
}
DeleteMeEnum=_enum;
}
}
[IgnoreDataMember]
public DeleteMe DeleteMeEnum{get;set;}
}
一旦应用程序发布,就没有好的方法来处理这个问题。然而,如果你提前计划好情况,它是可以处理的
因此,对于上面的示例,您可以这样做:
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; }
}
公共部分类TestDTO:ITestDTO
{
[DataMember(Name=“DeleteMeEnum”)]
私有字符串DeleteMeEnumString
{
获取{return DeleteMeEnum.ToString();}
设置{
DeleteMe _enum;
如果(!Enum.TryParse(值,out_Enum))
{
_枚举=;
}
DeleteMeEnum=_enum;
}
}
[IgnoreDataMember]
public DeleteMe DeleteMeEnum{get;set;}
}
是否已使用[DataMember]标记枚举的每个实例
attribute?@ste-fu我正在尝试序列化成员,这些成员是不存在的枚举的值表示抱歉-我有点困惑-您如何期望强制转换到不存在的值才能完全停止?@ste-fu c#允许将任何基于int的枚举强制转换为int值枚举,因此,我希望重写序列化程序以将所有枚举强制转换为其int值,并且当它们被反序列化时,它们会被强制转换回枚举(在本例中是这样的)(DeleteMe)2如果要接受未知值,为什么还要使用枚举?如果您需要使枚举中的管理更改更容易的话,那么请考虑。您是否使用<代码>标记了EnUM的每个实例[DATAMEMPON]?attribute?@ste-fu我正在尝试序列化成员,这些成员是不存在的枚举的值表示抱歉-我有点困惑-您如何期望强制转换到不存在的值才能完全停止?@ste-fu c#允许将任何基于int的枚举强制转换为int值枚举,因此,我希望重写序列化程序以将所有枚举强制转换为其int值,并且当它们被反序列化时,它们会被强制转换回枚举(在本例中是这样的)(DeleteMe)2如果要接受未知值,为什么还要使用枚举?如果你需要一些东西来简化枚举的管理变化,那么就考虑一下。