2010-04-05 42 views
7

Tôi có một dịch vụ NET web (sử dụng asmx ... chưa nâng cấp lên WCF chưa) đó cho thấy nhiều điều sau đây: lỗi serializationTại sao tôi không thể hiển thị giao diện trong dịch vụ web .NET asmx?

public class WidgetVersion1 : IWidget {} 
public class WidgetVersion2 : IWidget {} 

Khi tôi cố gắng để liên kết với các dịch vụ web, tôi nhận được như sau :

Không thể tuần tự hóa thành viên WidgetVersion1 thuộc loại IWidget vì đó là giao diện.

Tôi đã thử thêm các thuộc tính khác nhau vào giao diện IWidget (XmlIgnore, SoapIgnore, NonSerialized), nhưng chúng không hợp lệ trên giao diện.

Có ai biết tại sao tôi không thể hiển thị giao diện không? Tôi giả sử WSDL không hỗ trợ giao diện, nhưng không thể. NET có được xung quanh điều này bằng cách đơn giản không serializing giao diện? Có cách nào khác ngoài việc loại bỏ giao diện IWidget khỏi các định nghĩa lớp WidgetVersion1 và WidgetVersion2 không?

Trả lời

10

WCF cũng không thể tuần tự hóa giao diện; trên thực tế, không thể tuần tự hóa một giao diện qua SOAP.

Lý do (được đơn giản hóa) là khi deserializing, .NET phải có khả năng tạo một số lớp cụ thể thực tế. Giao diện là một khái niệm trừu tượng; luôn luôn có một lớp thực "" thực hiện đằng sau nó để cho một cá thể thực sự tồn tại.

Vì bạn không thể xây dựng một thể chất vật lý của một giao diện, nó cũng không thể được tuần tự hóa.

Nếu bạn đang cố gắng sử dụng XmlIgnoreAttribute, hãy hiểu rằng việc áp dụng nó cho loại loại sẽ không thực hiện bất kỳ điều gì. Nó cần phải được áp dụng cho các thành viên thành viên thay thế. Nói cách khác:

public class SerializableClass 
{ 
    [XmlElement] 
    public int ID { get; set; } 

    [XmlElement] 
    public string Name { get; set; } 

    [XmlIgnore] 
    public IMyInterface Intf { get; set; } 
} 

... sẽ tuần tự hóa OK, vì bộ nối tiếp sẽ không cố gắng tuần tự hóa thuộc tính Intf. Bạn chỉ không thể thêm thuộc tính [XmlIgnore] vào định nghĩa loại IMyInterface (nó sẽ không biên dịch).

+0

Cảm ơn bạn đã giải thích rõ ràng; nó có ý nghĩa hoàn hảo. – mcliedtk

+0

Tôi đã tự hỏi nếu đó là trường hợp và sau đó đọc câu hỏi một lần nữa và mặc dù ông đã cố gắng sử dụng một lớp học có một giao diện. – Joshua

2

Tạo hàm AsIWigit() trả về lớp cầu riêng tư thực hiện giao diện đã nói.

Điều này sẽ cung cấp cách chuyển đổi các lớp này sang giao diện thích hợp khi cần và sẽ hoạt động với các dịch vụ ASMX.

+0

+1 ý tưởng hay để nhận được khoảng – mcliedtk

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