[英]WCF Service object serialization
我有一個名為contact的抽象類,另一個名為client的類繼承自contact。 我正在使用帶有類型聯系參數的方法處理WCF服務。 但是我擁有的是我想傳遞的客戶端實例。 我面臨這個錯誤:
輸入數據合約名稱為“客戶:http://schemas.datacontract.org/2004/07/xxx”的“xxx.Client”不是預期的。 將任何靜態未知的類型添加到已知類型列表中 - 例如,通過使用KnownTypeAttribute屬性或將它們添加到傳遞給DataContractSerializer的已知類型列表中。
您需要讓DataContractSerializer知道Client
是一種Contact
。
有幾種方法可以做到這一點,但它們都圍繞着使用KnownType
屬性或ServiceKnownType
屬性。
可以將KnownType
放在Client
類上,告訴DataContractSerializer它是Contact
的KnownType。
[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
KnownType
也可以放在一個類上,表示在序列化這個類時你也可能會遇到另一個類。
如果您的DataContract
類具有可能實際包含Client
的Contact
的屬性,則可能需要執行此操作:
[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
Contact MeetingContact{get;}
}
在這種情況下,您可以在不指定客戶端上的KnownType的情況下離開。 如果您有一個返回集合的屬性,並且您想要指定可以在集合中的類型,則可能還需要執行此操作。
您可以指定靜態方法的名稱,而不是指定KnownType的實際類型,而該方法將返回已知類型:
[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
Contact MeetingContact{get;}
private static Type[] GetKnownType()
{
return new Type[]{typeof(Client)};
}
}
您還可以通過配置文件指定已知類型。
ServiceKnownTypes以類似的方式工作,但在服務本身上指定:
[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{
[OperationContract]
Contact GetContact();
}
此設置將讓DataContactSerializer知道任何方法都可以返回類型為Client
的類型。 以與已知類型類似的方式,您還可以使用靜態方法來提供已知類型的服務。
WCF不直接用於抽象類。 您應在datacontract或服務類上使用KnownType屬性。 以下是例子;
[DataContract]
[KnownType(typeof(Client))]
public class Contact
{
...
}
[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
contact getcontact(Guid id);
}
使用[KnownType]和[ServiceKnownType]屬性確保關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.