2010-06-23 37 views
20

Làm cách nào để xác định DataContract cho các lớp trừu tượng trong WCF?Sử dụng WCF với các lớp trừu tượng

Tôi có một lớp "Người" mà tôi liên lạc thành công bằng WCF. Bây giờ tôi thêm một lớp mới "Foo" được tham chiếu từ Person. Tất cả vẫn tốt. Nhưng khi tôi làm cho Foo trừu tượng và định nghĩa một lớp con thay vì nó không thành công. Nó thất bại ở phía máy chủ với một CommunicationException, nhưng điều đó không thực sự cho tôi biết nhiều.

lớp đơn giản của tôi làm cho thử nghiệm:

[DataContract] 
public class Person 
{ 
    public Person() 
    { 
     SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" }; 
    } 

    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public Foo SomeFoo { get; set; } 
} 

[DataContract] 
public abstract class Foo 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string BaseText { get; set; } 
} 

[DataContract] 
public class Bar : Foo 
{ 
    [DataMember] 
    public string SubText { get; set; } 
} 

Trả lời

30

Tôi đã tìm ra. Bạn cần phải xác định các lớp con trên lớp cơ sở trừu tượng bằng cách sử dụng "KnownType". Giải pháp là thêm thông tin này vào lớp Foo:

[DataContract] 
[KnownType(typeof(Bar))] // <------ added 
public abstract class Foo 
{ 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string BaseText { get; set; } 
} 

Kiểm tra this link.

+0

Hoàn hảo. Cảm ơn nhiều! –

2

Thú vị.

Tôi hy vọng mã đó sẽ không thành công trong hàm tạo Person vì bạn không thể trực tiếp khởi tạo Lớp tóm tắt.

+0

Điểm tốt. Đó có thể là lý do tại sao nó thất bại? Tìm thấy một giải pháp mặc dù. Hãy xem câu trả lời của riêng tôi .. – stiank81

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