2

WCF メソッドを使用して、かなり一般的なデータ セットを渡したいと考えています。データは基本的にキーと値のペアの階層セットですが、任意のレベルにネストされています。私はもともとそれを単一の文字列として渡し、両端でXMLまたはJSONまたは同様のエンコード/デコードを行うことを検討していましたが、とにかくWCFトランスポートはXMLであるため、少しばかげているように見えたので、渡す方法があることを望んでいます"当然"。

この方法はかなり簡単です。

[OperationContract]
void ProcessData(DataTree tree);

と:

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

これはすべて正常にコンパイルされますが、サービスを実行しようとすると、DataContract.GetStableName で StackOverflowException が発生してクラッシュします。

[CollectionDataContract]クラスに属性を付けて、DataTreeすべての名前を明示的に指定しようとしましたが、違いはないようです。

私もそれをつけようとしましたが、 is で[DataContract]あるため、さらに早く失敗します。DictionaryISerializable

何か案は?これを行うより良い方法はありますか?

4

2 に答える 2

1

過去に大きなオブジェクト ツリーの場合、データを自分でバイト配列にシリアル化し、WCF で送信しました (両端に WCF がある場合、WCF は SOAP/XML である必要はありません)。受け取り側。

基本的に、それ自体をシリアル化する問題のクラスのSerialize(BinaryWriter writer)andを作成し、再帰的なシリアル化のためにライター/リーダーを子オブジェクトに渡します。DeSerialize(BinaryReader reader)

シリアライゼーション/デシリアライゼーションにprotobuf-netを使用することも検討できます。WCF 呼び出しのトランスポートとして、または手動で、バイト配列をネットワーク経由で渡します。

于 2010-09-02T10:04:16.410 に答える
1

結局のところ、別の要件 (子のリストに加えてノードの単純な値を指定すること) が発生したため、とにかくその子型を定義することになりました。これにより、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; }
}
于 2010-09-06T00:29:39.313 に答える