2012-05-15 24 views
8

Tôi có một lớp trừu tượng có tên liên hệ và một lớp khác được gọi là ứng dụng khách kế thừa từ liên hệ. Tôi đang đối phó với một dịch vụ WCF với một phương pháp mà có một tham số của loại liên lạc. tuy nhiên những gì tôi có là một ví dụ của khách hàng mà tôi muốn vượt qua. Im đối mặt với lỗi này:Tuần tự hóa đối tượng dịch vụ WCF

Type 'xxx.Client' with data contract name 'Client:http://schemas.datacontract.org/2004/07/xxx' is not expected. Add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

Trả lời

5

WCF không trực tiếp hoạt động trên các lớp trừu tượng. Bạn sẽ sử dụng các thuộc tính KnownType trên lớp dữ liệu hoặc lớp dịch vụ. dưới đây là các ví dụ;

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact 
{ 
    ... 
} 

[ServiceContract] 
[ServiceKnownType(typeof(Client))] 
public interface IMyService 
{ 
    contact getcontact(Guid id); 
} 
+0

cảm ơn! chỉ hoạt động tốt – ancdev

+0

không sao. Xin vui lòng chấp nhận như là một câu trả lời nếu đang làm việc. – daryal

7

bạn định nghĩa để cho DataContractSerializer biết rằng một Client là một loại Contact.

Có một số cách để thực hiện việc này, nhưng tất cả đều xoay quanh việc sử dụng thuộc tính KnownType hoặc thuộc tính ServiceKnownType.

KnownType có thể được đặt trên lớp Client để thông báo cho DataContractSerializer rằng đó là KnownType là Contact.

[DataContract] 
[KnownType(typeof(Client))] 
public class Contact{} 

KnownType cũng có thể được đặt trên lớp để cho biết khi nối tiếp lớp này, bạn cũng có thể gặp phải lớp khác này.

Bạn có thể muốn làm điều này nếu bạn có một lớp DataContract rằng có một tài sản mà là một Contact mà thực sự có thể chứa một Client:

[DataContract] 
[KnownType(typeof(Client))] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 
} 

Trong trường hợp này bạn có thể lấy đi mà không xác định KnownType trên khách hàng. Bạn cũng có thể muốn thực hiện việc này nếu bạn có thuộc tính trả về một bộ sưu tập và bạn muốn chỉ định các loại có thể có trong bộ sưu tập.

Bạn có thể, thay vì quy định cụ thể các loại thực tế của KnownType, chỉ định tên của một phương pháp tĩnh mà sẽ trả về các loại tiếng thay vì:

[DataContract] 
[KnownType("GetKnownTypes")] 
public class Meeting 
{ 
    Contact MeetingContact{get;} 

    private static Type[] GetKnownType() 
    { 
    return new Type[]{typeof(Client)}; 
    } 
} 

Bạn cũng có thể xác định loại biết đến thông qua các configuration file.

ServiceKnownTypes làm việc theo một cách tương tự, nhưng được quy định trên Dịch vụ bản thân:

[ServiceKnownType(typeof(Client))] 
[ServiceContract()] 
public interface IMyServiceContract 
{ 

    [OperationContract] 
    Contact GetContact(); 
} 

này thiết lập sẽ cho phép các DataContactSerializer biết rằng bất kỳ phương pháp có thể trở lại một loại loại Client. Theo cách tương tự với các kiểu đã biết, bạn cũng có thể sử dụng một phương thức tĩnh để cung cấp các loại dịch vụ đã biết.

+2

+1: 2 phút quá muộn, nhưng chi tiết hữu ích hơn rất nhiều. –

+0

thông tin chi tiết +1. – daryal

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