簡體   English   中英

WCF服務對象序列化

[英]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類具有可能實際包含ClientContact的屬性,則可能需要執行此操作:

[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM