我试图序列化可能尚不存在的枚举值。 我有一个现有的项目,在我们的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?
答案 0 :(得分:0)
发布应用程序后,没有一种很好的方法来处理此问题。但是,如果您提前计划好情况,则可以解决。
因此对于上面的示例,您可以执行以下操作:
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; }
}