2

私は次の構造を持っています:

public class DerivedClass : List<BaseClass>
{
   //Some helper methods used against the List of BaseClass properties

   //Methods
   public  List<BaseClass> GetListOfBaseClasses()
   {
       return (List<BaseClass>)this;
   }
}

私のWCFサービスはBaseClassオブジェクトを認識していますが、次のようにサービスを呼び出そうとすると、クライアントはそれを汎用リストとして取得しました。

DerivedClass classD;
FillData(classD)
List<BaseClass> baseClassList = classD.GetListOfBaseClasses();

using (IService myService = ObjectFactory.GetMyService())
{
      myService.DoSomething(baseClassList); //Method is expecting "List<BaseClass>"
}

次の例外が発生します。

データコントラクト名が「[一部のURIテキスト]」の「DerivedClass」と入力する必要はありません。DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

これらの属性をさまざまな組み合わせでクラスに追加しようとしましたが、それでもうまくいきませんでした。

[Serializable]
[KnownType(typeof(List<BaseClass>))]
[XmlInclude(typeof(List<BaseClass>))]
[KnownType(typeof(BaseClass))]
[XmlInclude(typeof(BaseClass))]
public class DerivedClass : List<BaseClass>
{
  /// ...
}

PS-シーズ、このサイトの入力フィールドがファンキーだと思うのは私だけですか?フォーマットしようとすると、物事は動き続けます...:| 私が望むようにテキストを入力するという考えを得ることができないにもかかわらず、素晴らしいサイトです。

4

2 に答える 2

4

サービスインターフェイスにServiceKnownTypeAttributeを設定する必要があります。

[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
    // Service declaration
}
于 2012-11-17T01:03:32.177 に答える
0

既知の型を登録する方法はいくつかあります。ただし、最初にDataContract に関する記事と、 DataContractSerializer でサポートされている型を調べてください。

DataContractに属性を追加していないことに注意してくださいDerivedClass BaseClass。属性でマークされたクラスSerializableは有効であり、WSDL で公開できますが、 にDataContractAttibuteは相互運用性のために設計されたシリアル化規則があり、WCF の優先シリアル化メカニズムです。

データ コントラクトに既知の型を登録する場合は、これで十分です。

[DataContract]    
public class DerivedClass : List<BaseClass>
{
  /// ...
}

[DataContract]
[KnownType(typeof(DerivedClass))]
public clas BaseClass
{
    //Add the DataMemberAttribute to the properties you want serialized.
}

既知のタイプをサービス コントラクト レベルで登録する場合は、 にServiceKnownType属性を追加しますServiceContract

于 2012-11-17T01:55:27.687 に答える