2011-08-07 11 views
7

Napisałem ContractInvariantMethod dla klasy kontraktu danych i wszystko działa świetnie po stronie klienta, jednak gdy obiekt tego typu jest wysyłany do mojej usługi, a Deserializator kontraktu danych próbuje deserializować to, sprawdzanie kontraktu kodu dostaje się sposób i rzuca ContractException, mówiąc niezmiennik nie powiodło się. Powód jest taki, że w (domyślnym) konstruktorze klasy ustawiam właściwości, aby spełnić wymagania niezmiennika, ale najwyraźniej konstruktor nie zostanie wywołany, gdy obiekt jest deserializowany. jest rozwiązanie tego problemu?Jak sprawić, by umowy kodowe działały z deserializacją umów dotyczących danych?

tutaj jest moja klasa kontrakt dane:

[DataContract] 
public class DataContractClass 
{ 
public DataContractClass() 
{ 
    this.Field1= this.Field2= -1; 
} 
[DataMember] 
public int Field1 {get; set;} 
[DataMember] 
public int Field2 {get; set;} 

[ContractInvariantMethod] 
private void Invariants() 
{ 
    Contract.Invariant(this.Field1== -1 || this.Field2== -1); 
} 
} 
+0

jesteś w stanie pokazać nam przykład kodu? To może pomóc. –

+0

Zmieniłem pytanie, aby dołączyć kod. – Arash

Odpowiedz

6

Podczas sprawdzania wykonawczego, niezmienniki są badane na końcu każdej metody publicznej.

Tak więc, gdy Serializer ustawi właściwości Property1 i Property2 na -1, otrzymasz wyjątek kontraktu, ponieważ deserializator nie użyje konstruktora.

Więc użyj tego:

public DataContractClass() 
{ 
    SetDefaults(); 
} 

[OnDeserializing] 
private void OnDeserializing(StreamingContext context) 
{ 
    SetDefaults(); 
} 

private void SetDefaults() 
{ 
    Property1 = -1; 
    Property2 = -1; 
} 
+0

Pytanie, jak to zrobić. – svick

+0

tak, to prawda, ale czy istnieje sposób, aby to zadziałało? jak wymuszenie uruchomienia konstruktora, gdy obiekt jest deserializowany i przed ustawieniem jakichkolwiek właściwości? – Arash

+0

@svick teraz z rozwiązaniem – Skomski