2011-08-05 92 views
0

我已經構建了一個WCF服務庫,我添加了幾個第三方DLL的引用。這是我的接口運行WCF服務庫時出錯

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    3rdpartyreturntype GetObj(System.Windows.Controls.Control txtcontrol); 
} 

// Use a data contract as illustrated in the sample below to add composite types to service operations 
[DataContract] 
public class nclass 
{ 
    [DataMember] 
    public System.Windows.Controls.Control txtcontrol 
    { 
     get { return txtcontrol; } 
     set { txtcontrol = value; } 
    } 

    [DataMember] 
    public 3rdpartyreturntype nobj 
    { 
     get { return vuiobj; } 
     set { vuiobj = value; } 
    } 

    [DataMember] 
    public System.Windows.Input.TouchDevice tchdev 
    { 
     get { return tchdev; } 
     set { tchdev = value; } 
    } 
} 

我已經實現了上面的接口。當我運行服務時出現以下錯誤,任何人都可以幫我解決問題嗎?

類型'System.Windows.Input.TouchDevice'不能被序列化。考慮 使用DataContractAttribute屬性標記它,並用DataMemberAttribute屬性標記要序列化其成員的所有 。

+0

你能爲所有3rdpartyreturntype編寫包裝嗎?如果是這樣,那麼可以用'[DataMember]'屬性標記。 –

回答

0

如果您想要像序列化一個類的複雜類型,您必須將其每個成員聲明爲datacontract的數據成員和類。

在這種情況下,觸摸設備是複雜的類型(類),因此您需要將其所有成員標記爲數據成員和類作爲datacontract。

但是正如我從它可以看到它屬於system.windows.input類型可能不會被序列化。因此您不能將其用作數據成員。

如果您僅使用一組屬於touchDevice類的成員,則可以創建自己的類,該類僅映射可序列化的一組touchdevice成員。並用datacontract和datamember屬性裝飾這個新類。

+0

GetObj方法是第三方方法,它們所期望的參數是System.Windows.Controls.Control,所以我不能改變它。此外,我只添加觸摸設備,因爲我得到它的錯誤,我沒有使用它的任何地方(也許第三部分DLL使用它不知道)。此外,我使用反射器,並看看第三方類「3rdpartyreturntype」,如果我可以將其成員映射到我自己的類和序列化該類。但從我所看到的,它的一個屬性是一項服務。我必須映射所有的屬性嗎?我如何映射服務? – user869861

0

看起來類型「System.Windows.Input.TouchDevice」本身沒有標記爲可序列化或DataContract。

而不是試圖直接傳遞TouchDevice和控件,也許你可以傳遞你關心的屬性。我猜在TextControl的情況下,你只關心Text值。對於TouchDevice,可能是源和目標控件的名稱?

+0

GetObj方法是第三方方法,他們期望的參數是System.Windows.Controls.Control,所以我不能改變它。此外,我只添加觸摸設備,因爲我得到它的錯誤,我沒有使用它的任何地方(也許第三部分DLL使用它不知道)。此外,我使用反射器,並看看第三方類「3rdpartyreturntype」,如果我可以將其成員映射到我自己的類和序列化該類。但從我所看到的,它的一個屬性是一項服務。我必須映射所有的屬性嗎?我如何映射服務? – user869861