2010-07-02 31 views
37

Sau khi đọc tài liệu tham khảo MSDN, tôi vẫn có câu hỏi về thời điểm sử dụng thuộc tính KnownType. Tôi hiểu rằng thuộc tính giao tiếp thông tin kiểu cho serializer, nhưng khi nào cần thiết? Có thích hợp khi lớp được tuần tự hóa có tham chiếu của một loại lớp cơ sở, và có các lớp phái sinh phái sinh có thể được đặt thành các tham chiếu đó không?Khi nào thích hợp để sử dụng thuộc tính KnownType?

Hơn nữa, có bất kỳ hạn chế nào để lạm dụng thuộc tính không? Ví dụ, trong ví dụ trước, nếu lớp tuần tự được đánh dấu bằng KnownType (baseClass) mặc dù có một tham chiếu rõ ràng đến kiểu đó?

Trả lời

58

[KnownType] là cần thiết để nói với nó về phân nhóm. Những bất lợi của không sử dụng nó là những điều sau đây sẽ không làm việc:

[DataContract] 
class Foo {} 

[DataContract] 
class Bar : Foo {} 

với một phương pháp trên giao diện WCF trả về:

public Foo GetFoo() { return new Bar(); } 

Nếu không có thuộc tính, serializer (đặc biệt đối với loại mex/proxy được tạo) sẽ không biết về Bar và sẽ không thành công. Với thuộc tính:

[DataContract, KnownType(typeof(Bar))] 
class Foo {} 

sẽ hoạt động. Điều này chỉ áp dụng cho DataContractSerializer - với NetDataContractSerializer bạn nhận được dữ liệu loại theo một cách khác.

+1

ngọt! Ví dụ tuyệt vời, quá. Cảm ơn! – bwerks

6

Thuộc tính KnownType là cần thiết khi bạn đang sắp xếp các loại không cụ thể như giao diện hoặc lớp cơ sở. Trình serializer WCF phải biết về tất cả các triển khai có thể có của giao diện hoặc lớp kế thừa. Bất kỳ triển khai nào mà nó không biết sẽ gây ra một ngoại lệ tuần tự hóa.

Một sử dụng possable có thể được tìm thấy trong này SO question

5

Nếu bạn đang sử dụng "thừa kế" XSD trong lược đồ của mình.

Bạn đã nhận nó ngược; KnownTypeAttribute được áp dụng cho lớp cơ sở và đặt tên cho tất cả các lớp dẫn xuất có thể được chuyển như một tham chiếu đến cơ sở.

Ví dụ:

... 
KnownType(typeof(POBoxAddress)) 
KnownType(typeof(StreetAddress)) 
KnownType(typeof(SingleLineAddress)) 
KnownType(typeof(ParsedAddress)) 
public abstract class AddressBase 
{ 
    ... 
} 
Các vấn đề liên quan