2011-08-05 91 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