2009-08-11 29 views
9

Tôi có một lớp trừu tượng. Hãy gọi nó là Lifeform. Nó trông giống như sau:Dịch vụ web ASMX không tuần tự hóa lớp cơ sở trừu tượng

public abstract class Lifeform { 
    public virtual int Legs { get; set; } 
    public virtual int Arms { get; set; } 
    public virtual bool Alive { get; set; } 
} 

(Thuộc tính ảo là do thực tế rằng tôi đang sử dụng nHibernate, mà than vãn nếu họ không tính ảo.)

sau đó tôi có một lớp học mà được thừa hưởng từ lớp Lifeform đó; chúng ta sẽ gọi nó là Human. Có vẻ như:

public class Human: Lifeform { 
    public virtual bool Hat { get; set; } 
    public virtual int Age { get; set; } 
    public virtual string Name { get; set; } 
} 

Mọi thứ đều đáng yêu, tôi có thể sử dụng các lớp học của mình, Con người nhận được chân, cánh tay và thuộc tính sống khi tôi đang sử dụng. Ngoại trừ, đó là, khi tôi cố gắng tạo một dịch vụ web bằng cách sử dụng lớp Human. Đối tượng được tuần tự hóa cho tôi Hat, Age, và Name - nhưng không có các thuộc tính Legs, Arms, hoặc Alive.

Tôi đã nhìn thấy một workaround rằng đề nghị sử dụng

[System.Xml.Serialization.XmlInclude(typeof(Human))] 

Trên lớp cơ sở (Lifeform), nhưng điều đó có vẻ như một hack khủng khiếp vi phạm OO. Đặt các liên kết trên lớp cơ sở vào các lớp thừa hưởng nó? Eww.

Có ai gặp sự cố cụ thể này trước đây không? Có ý tưởng nào không? Tôi sẽ cung cấp thêm mã nếu một ví dụ chuyên sâu hơn sẽ giúp mô tả những gì tôi đang làm nhiều hơn.

+0

Tôi đã gặp vấn đề tương tự và điều này đã giúp tôi giải quyết vấn đề. Cuối cùng tôi đã thiết lập thuộc tính trên lớp thay vì phương thức trả về nó. – Guffa

Trả lời

8

Từ những gì tôi đã đọc, bạn có thể bao gồm thuộc tính XMLInclude trên phương thức web trả về đối tượng thay vì trong lớp cơ sở. Vẫn không đẹp, nhưng có thể lôi cuốn bạn nhiều hơn là đặt tên lớp dẫn xuất trong lớp cơ sở. Tôi đã không thử nó, nhưng tôi nghĩ bạn có thể làm một cái gì đó như thế này.

[WebMethod] 
[XmlInclude(typeof(LifeForm))] 
public Human GetHuman() 
{ 
    return new Human(); 
} 
+0

Tuyệt vời, cảm ơn. Lúc đầu nó không hoạt động - nhưng có vẻ như tạo ra mã đúng, nó không hiển thị trong mẫu. Tôi tiếp tục thử nó và nó không có vẻ làm việc, cho đến khi tôi figured "những gì heck" và thực sự tạo ra các đối tượng serialized. Đẹp. Không hoàn hảo, nhưng hey, đó là cách tốt hơn so với gunking lên các lớp cơ sở của tôi. Cảm ơn! –

+0

Làm thế nào về nếu bạn muốn vượt qua lớp cơ sở như một tham số và đưa nó vào con người trong hàm GetHuman? Khả thi? –

+0

Tôi sẽ liệt kê nhiều loại như thế nào? – Stainedart

0

Chạy vào cùng một vấn đề với VB.NET. Sử dụng thuộc tính XMLInclude, trong khi xấu xí, đã làm các trick.

+0

Thật không ngạc nhiên khi cùng một vấn đề xảy ra với VB.NET, vì nó là một vấn đề .NET, chứ không phải vấn đề C#. –

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