2013-06-26 3 views
0

У меня есть следующие:Сериализация перечислимого с NetDataContractSerializer

[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 
} 

и я использую следующие преобразования между ошибки и исключения в клиент-сервер ФОС: Converting Fault to exceptions

Дело в том, что, когда я я преобразование исключения придираться с этим:

// 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); 

перечисления не будучи serializied и когда я десериализация I г et значение по умолчанию для перечисления.

Что мне не хватает?

ответ

0

Украсить EnumMemeber как так

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

до сих пор не работает. Я все еще получаю значение перечисления по умолчанию. –

+0

Это не требуется in.net 3.5 и более поздних версий – ilansch

0

У меня была такая же проблема.
Я сделал простой обход, который может быть вам полезен, когда вы отправляете перечисление, передаете int/string, отправляете строку int/string (в контракте данных - я передал ее в WCF), а затем на службу, переместите int/string в ваш enum.

При литье обратно в перечислении, используйте

Enum.Parse(..) 
+0

Я попытался добавить еще одно свойство int в класс simulationException. Я отредактировал это свойство, и снова получим его со значением по умолчанию 0. Поэтому я думаю, что это не решение .... –

+0

Это решение, если вы пропустили его, его проблема в вашем приложении, Enum - это тип значения, и он должен иметь значение. в вашем случае значение GeneralError равно «3», вместо отправки перечисления «SimulationExceptionStatusCode» в DataContract, отправьте его как строку со значением и со стороны службы, верните строку обратно в перечисление. Это необходимо для сериализации, поскольку мы все можем сериализовать строку. поэтому проблема заключается в том, что вы сериализуете само Исключение, а не перечисление. – ilansch

+0

Кстати, взглянув на ваш код, вы пытаетесь сериализовать исключение, я считаю, что это неправильно. из моего понимания, это не хорошая практика для сериализации исключения, отправьте исключение как строку. http://stackoverflow.com/questions/486460/how-to-serialize-an-exception-object-in-c – ilansch