我正在尝试序列化可能尚不存在的枚举值。我有一个现有的项目,在我们的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?
一旦您的应用程序发布,就没有一种很好的方法来处理这个问题。但是,如果您提前计划这种情况,可以进行处理。
因此,对于上面的示例,您可以这样做:
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; }
}