4

そのため、私はこの問題の調査に数時間を費やしましたが、私だけではないことは明らかです。辞書とリストが配列として返されるのはなぜですか?

互換性のために配列がデフォルトとして使用されていることを理解しています。WCF は、.Net に依存しないように意識的に努力しています。しかし、サーバーとクライアントの両方が C# .Net で開発されているので、問題ありません。

以下は、StackOverflow だけに関する同様の質問のサンプルです。

  1. リストの代わりに配列を返す WCF サービス
  2. WCF が期待どおりに List ではなく myObject[] を返すのはなぜですか?
  3. 辞書の配列を返す WCF サービス
  4. リストの代わりに配列を返すWCFプロキシコレクションタイプ== Generic.List
  5. リストの代わりに配列を返すWCFコレクションタイプ== Generic.List
  6. WCF サービスが List ではなく ARRAY を返すのはなぜですか?
  7. svcutil.exe を使用して生成された WCF サービス プロキシのリストではなく配列

私が設定したもの: サービス参照構成

次のコマンドを使用してプロキシを生成しています。

 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>svcutil.exe /language:cs
 /out:generatedProxy.cs /config:app.config /ct:System.Collections.Generic.List`1
  http://192.168.0.99:9000/ProjectDatabase/??

私のサービス契約は次のようになります。

[ServiceContract]
public interface IMyContract
{
    [OperationContract]
    [ServiceKnownType(typeof(Dictionary<int, string>))]
    Dictionary<int, string> getClassDictionary();
}

私の実装:

public Dictionary <int, string> getClassDictionary()
{
   Dictionary<int, string> myDict = new Dictionary<int, string>();
   myDict.Add(1, "Geometry");
   myDict.Add(2, "Algebra");
   myDict.Add(3, "Graph Theory");
   return myDict; 
}

私の中でさえ、私Reference.svcmapは持っています:

<CollectionMappings>
  <CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" />
</CollectionMappings>

ただし、最善の努力と調査にもかかわらず、次の結果が得られます。

Dictionary<'int, string'> は ArrayOfKeyValueOfintstringKeyValueOfintstring[] として返されます

と:

List<'T'> は T[] として返されます

私はすべてを試し、すべてを正しく行ったように感じますが、何かが欠けている必要があります. それで、それは何ですか?お時間、ご協力、ご検討いただきありがとうございます。

アップデート:

私は、Arraya を書き込んでserializable struct配列に追加することで、面付けを回避する方法を試みました。

[Serializable]
public struct KeyValuePair<K, V>
{
    public K Key { get; set; }
    public V Value { get; set; }
}

しかし、私が返すときKeyValuePair<int, string>[]。私のプロキシは のリターンを生成していKeyValuePairOfintstring[]ます。

解決策は以下に掲載されています。

4

1 に答える 1

4

さて、連載が粗雑になった原因がわかりました。

私のServiceContract中には次のものがありました:

[OperationContract]
List<DataTable> ShowTables();
[OperationContract]
DataTable FetchContacts(string filter = "All");
[OperationContract]
DataTable FetchUsers();
[OperationContract]
DataTable FetchDrops();

これをコメントアウトして WCF サービス ライブラリを再コンパイルした後、プロキシの生成時にすべてが適切にシリアル化/逆シリアル化されていることがわかりました。

svcutil.exeシリアル化の方法がわからないものに遭遇すると、すべての賭けがオフになるようです。文字通り、コマンド/設定を無視し、すべてを意味不明なものとしてシリアル化しますArrayOfKeyValueOfinttringKeyValueOfintstring. したがって、このエラーが発生した場合は、svcutil.exe返されたものすべてを適切にシリアル化できるかどうかを自問する必要があります。

私の問題の原因の特定が、将来他の人に役立つことを願っています.

于 2013-05-21T15:28:33.800 に答える