2011-08-07 25 views
7

Tôi đã viết ContractInvariantMethod cho lớp hợp đồng dữ liệu và mọi thứ hoạt động tốt ở phía máy khách, tuy nhiên khi đối tượng thuộc loại này được gửi đến dịch vụ của tôi và Deserializer dữ liệu cố gắng deserialize nó, kiểm tra hợp đồng mã cách và ném ContractException, nói bất biến thất bại. Lý do là trong constructor (mặc định) của lớp, tôi thiết lập các thuộc tính để thỏa mãn bất biến, nhưng dường như constructor không được gọi khi đối tượng đang được deserialized. có giải pháp cho vấn đề này không?Làm thế nào để thực hiện các hợp đồng mã làm việc với deserialization các hợp đồng dữ liệu?

đây là lớp hợp đồng dữ liệu của tôi:

[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

là bạn có thể chỉ cho chúng ta một ví dụ về mã của bạn? Nó có thể giúp. –

+0

tôi đã thay đổi câu hỏi để bao gồm mã. – Arash

Trả lời

6

Trong kiểm tra thời gian chạy, bất biến là kiểm tra ở phần cuối của mỗi phương pháp công cộng.

Vì vậy, khi bộ nối tiếp đặt thuộc tính1 và thuộc tính2 không -1 bạn nhận được ngoại lệ hợp đồng vì trình khử không sử dụng hàm tạo.

Vì vậy, sử dụng này:

public DataContractClass() 
{ 
    SetDefaults(); 
} 

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

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

Câu hỏi đặt ra là làm thế nào để thực hiện công việc này. – svick

+0

vâng, đúng vậy, nhưng có cách nào để nó hoạt động không? như buộc constructor chạy khi đối tượng đang được deserialized và trước khi bất kỳ thuộc tính được thiết lập? – Arash

+0

@svick ngay bây giờ với giải pháp – Skomski

Các vấn đề liên quan