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”,而是将其作为字符串发送,并使用该值,在服务端,将字符串强制转换回枚举。这必须序列化,因为我们都可以序列化字符串。因此,问题在于序列化异常本身,而不是枚举。顺便说一句,通过查看代码,您试图序列化异常,我认为这是错误的。据我所知,序列化异常并将异常作为字符串发送不是一种好的做法。