C# 使用NetDataContractSerializer序列化枚举

C# 使用NetDataContractSerializer序列化枚举,c#,wcf,serialization,enums,netdatacontractserializer,C#,Wcf,Serialization,Enums,Netdatacontractserializer,我有以下资料: [Serializable] public class SimulationException : Exception { public SimulationExceptionStatusCode StatusCode { get; set; } public SimulationException() { } public SimulationException(string msg) : base(msg) { } pro

我有以下资料:

[Serializable]
public class SimulationException : Exception
{
    public SimulationExceptionStatusCode StatusCode { get; set; }

    public SimulationException()
    { }

    public SimulationException(string msg) : base(msg)
    { }

    protected SimulationException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    { }
}

[Serializable]
public enum SimulationExceptionStatusCode
{
    SimulationInstanceNotExist,
    LocationNotExist,
    InvalidOperation,
    GeneralError
}
我使用以下方法在客户端服务器wcf中的故障和异常之间进行转换:

问题是,当我将异常转换为故障时:

// converting to error to falut message Fault
MessageFault messageFault = MessageFault.CreateFault(
                new FaultCode("Sender"),
                new FaultReason(error.Message),
                error,
                new NetDataContractSerializer());
fault = Message.CreateMessage(version, messageFault, null);
枚举没有被序列化,当我反序列化时,我会得到枚举的默认值


我错过了什么?

像这样用EnumMemeber装饰它

[DataContract(Name = "SimulationExceptionStatusCode")]
public enum SimulationExceptionStatusCode
{
    [EnumMember]
    SimulationInstanceNotExist,
    [EnumMember]
    LocationNotExist,
    [EnumMember]
    InvalidOperation,
    [EnumMember]
    GeneralError
}

我也有同样的问题。
我做了一个可能对您有好处的简单工作,在发送枚举时,将int/string转换为int/string,发送int/string(在数据契约中-我在WCF中传递了它),然后在服务中,将int/string转换为您的枚举

当强制转换回枚举时,请使用

Enum.Parse(..)

这在.net 3.5中是不需要的,后来我尝试向simulationException类添加另一个int属性。我编辑了该属性,并再次使用默认值0获取它。所以我猜这不是解决方案……这是一个解决方案,如果您没有实现它,这是应用程序中的一个问题,Enum是一个值类型,它必须有一个值。在您的例子中,GeneralError的值是“3”,而不是在DataContract中发送枚举“SimulationExceptionStatusCode”,而是将其作为字符串发送,并使用该值,在服务端,将字符串强制转换回枚举。这必须序列化,因为我们都可以序列化字符串。因此,问题在于序列化异常本身,而不是枚举。顺便说一句,通过查看代码,您试图序列化异常,我认为这是错误的。据我所知,序列化异常并将异常作为字符串发送不是一种好的做法。