2011-08-07 28 views
7

Veri sözleşmesi sınıfı için bir ContractInvariantMethod yazdım ve her şey istemci tarafında harika çalışıyor, ancak bu tür bir nesne benim hizmetime gönderildiğinde ve Veri Sözleşme Desperizleyicisi onu seri hale getirmeye çalıştığında, kod denetimi denetleniyor yol ve değişmez başarısız diyerek ContractException atar. Bunun nedeni, sınıfın (varsayılan) yapıcısında, değişmezi karşılayacak özellikleri ayarladım, ancak nesne seri hale getirildiğinde yapıcının çağrılmadığı anlaşılıyor. bunun için bir çözüm var mı?Kod sözleşmeleri, veri sözleşmelerinin serileştirilmesiyle nasıl çalışır?

burada verilerim sözleşme sınıftır:

[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

Eğer bize kodu örneği göstermek edebiliyoruz? Yardımcı olabilir. –

+0

Kodu dahil etmek için soruyu değiştirdim. – Arash

cevap

6

çalışma zamanı denetimi sırasında, değişmezler her kamu yöntemin sonunda kontrol bulunmaktadır.

Serializer Property1 ve Property2 değerini -1 değerine ayarlamazsa, desperizer bir yapıcı kullanmaz, çünkü bir sözleşme istisnası alırsınız.

Yani bu kullanmak

:

public DataContractClass() 
{ 
    SetDefaults(); 
} 

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

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

Sorun, bu işin nasıl yapılacağıdır. – svick

+0

evet, doğru, ama işe yaramanın bir yolu var mı? nesne seri hale getirilirken ve herhangi bir özellik ayarlanmadan önce çalışacak şekilde çalışmayı zorlamak gibi mi? – Arash

+0

@svick şimdi bir çözümle – Skomski