WCFを通じて再帰的なコレクションを渡します
-
26-09-2019 - |
質問
私は、WCFメソッドを介してデータのかなり一般的なセットを渡したいです。データは、基本的には、キー/値ペアのちょうど階層セットですが、それは任意のレベルにネストされています。私はもともと1つの文字列としてかかわらず、それを渡すと、どちらかの端でデコード/ XMLまたはJSONまたは類似の符号化を行っていると考えられるが、WCF輸送以来、私はそれを通過する方法があります望んでいるので、愚かな少し見えたXMLをとにかくです"自然に"。
この方法は非常に簡単です。
[OperationContract]
void ProcessData(DataTree tree);
と
public class DataTree : Dictionary<string, DataTree>
{
}
このすべてのコンパイルの罰金、私はそれがDataContract.GetStableName下StackOverflowExceptionがでクラッシュしたサービスを実行しようとします。
私はすべての名前を指定して明示的に[CollectionDataContract]
クラスにDataTree
属性を入れて試してみたが、それはすべての違いを確認していないようでした。
私もそれに[DataContract]
を入れて試してみたが、Dictionary
がISerializable
あるので、それは以前にも失敗します。
任意のアイデア?これを行うには良い方法は?あります。
解決 2
、別の要件はそれでWCFの幸せを作っているように思われる、(子のリストに加えて、ノードのための単純な値を指定する)思い付い:
[CollectionDataContract(IsReference = true, ItemName = "Param",
KeyName = "Name", ValueName = "Data")]
public class DataTree : Dictionary<string, DataTreeEntry>
{
}
[DataContract]
public class DataTreeEntry
{
[DataMember]
public string Value { get; set; }
[DataMember]
public DataTree Children { get; set; }
}
他のヒント
私は(あなたが両端にWCFを持っている場合、SOAP / XMLである必要はありませんし、WCF)WCFを介して送信されたバイト配列にデータを自分自身をシリアライズしている、と非直列化それを手動受信側でます。
基本的に自分自身をシリアライズ問題のクラスのためのSerialize(BinaryWriter writer)
とDeSerialize(BinaryReader reader)
を作成し、再帰的な直列化のための子オブジェクトへのダウンライター/リーダーを渡します。
また、シリアライズ/デシリアライゼーションのためのいるProtobufネットに使用に見ることができます。どちらかあなたのWCF呼び出しのトランスポートとして、または手動で、ワイヤの上にバイト配列を渡します。