質問

私は、WCFメソッドを介してデータのかなり一般的なセットを渡したいです。データは、基本的には、キー/値ペアのちょうど階層セットですが、それは任意のレベルにネストされています。私はもともと1つの文字列としてかかわらず、それを渡すと、どちらかの端でデコード/ XMLまたはJSONまたは類似の符号化を行っていると考えられるが、WCF輸送以来、私はそれを通過する方法があります望んでいるので、愚かな少し見えたXMLをとにかくです"自然に"。

この方法は非常に簡単です。

[OperationContract]
void ProcessData(DataTree tree);

public class DataTree : Dictionary<string, DataTree>
{
}

このすべてのコンパイルの罰金、私はそれがDataContract.GetStableName下StackOverflowExceptionがでクラッシュしたサービスを実行しようとします。

私はすべての名前を指定して明示的に[CollectionDataContract]クラスにDataTree属性を入れて試してみたが、それはすべての違いを確認していないようでした。

私もそれに[DataContract]を入れて試してみたが、DictionaryISerializableあるので、それは以前にも失敗します。

任意のアイデア?これを行うには良い方法は?あります。

役に立ちましたか?

解決 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呼び出しのトランスポートとして、または手動で、ワイヤの上にバイト配列を渡します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top