2011-08-05 28 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としてクラスを宣言する必要があります。

この場合、タッチデバイスは複合型(クラス)なので、すべてのメンバをdatamontとしてマークし、datacontractとしてマークする必要があります。

私はtypeから見るとsystem.windows.inputに属しているため、クラスはシリアル化されていない可能性があります。したがって、これをデータメンバーとして使用することはできません。

touchDeviceクラスに属するメンバーのセットだけを使用している場合は、シリアル化できるタッチデバイスメンバーのセットだけをマップする独自のクラスを作成できます。 datacontract属性とdatamember属性でこの新しいクラスを修飾します。

+0

GetObjメソッドはサードパーティのメソッドであり、それらが期待しているパラメータはSystem.Windows.Controls.Controlなので、それを変更することはできません。また、私はエラーでそれを取得していたため、私はタッチデバイスを追加した、私はどこにでも使用していない(おそらく3番目の部分のDLLはそれがわからない)を使用しています。また、リフレクターを使用し、メンバーを自分のクラスにマップしてそのクラスをシリアライズすることができれば、サードパーティーのクラス "3rdpartyreturntype"を見ていました。しかし、私が見ているものから、その財産の一つはサービスです。私はすべてのプロパティをマップする必要がありますか?どのように私はサービスをマップすることができますか? – user869861

0

"System.Windows.Input.TouchDevice"型は、それ自体がシリアライズ可能またはデータコントラクトとしてマークされていないように見えます。

TouchDeviceとControlを直接渡すのではなく、気になるプロパティを渡すことができます。 TextControlの場合、Text値だけを気にすると思います。また、TouchDeviceの場合、ソースとターゲットのコントロール名は?

+0

GetObjメソッドはサードパーティのメソッドであり、それらが期待しているパラメータはSystem.Windows.Controls.Controlなので、それを変更することはできません。また、私はエラーでそれを取得していたため、私はタッチデバイスを追加した、私はどこにでも使用していない(おそらく3番目の部分のDLLはそれがわからない)を使用しています。また、リフレクターを使用し、メンバーを自分のクラスにマップしてそのクラスをシリアライズすることができれば、サードパーティーのクラス "3rdpartyreturntype"を見ていました。しかし、私が見ているものから、その財産の一つはサービスです。私はすべてのプロパティをマップする必要がありますか?どのように私はサービスをマップすることができますか? – user869861

関連する問題