0
[DataContract]
    public class AssetData
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public List<AssetData> ChildAssets { get; set; }
        [DataMember]
        public int Priority { get; set; }
        [DataMember]
        public AssetData ParentNode { get; set; }
    }

[ServiceKnownType(typeof(Dictionary<string, AssetData>))]
    public interface IRtxEquipmentConfiguration
    {
        [OperationContract] 
        object GetData(string sKey, string sRequest);
    }

上記の OperationContract"GetData"の場合、サーバーは AssetData のディクショナリを返します。AssetData を DataContract としてマークし、そのすべてのフィールドを DataMembers としてマークしました。クライアント側で、「ソケット接続が破棄されました。\r\nオブジェクト名: 'System.ServiceModel.Channels.SocketConnection'.」という wcf エラーが発生していました。このエラーは、ChildAssets フィールドが原因であると思われます。このフィールドを単独で無効にすると (DataMember タグを削除して)、クライアント側ですべてのディクショナリ要素を取得でき、各要素で ChildAssets を除くすべてのフィールドを取得できました。残りのフィールド Name、ParentNode、および Priority を確認できます。

WCF がディクショナリ要素でリストをシリアル化できない理由の手がかりはありますか?

4

1 に答える 1

0

IsReference = trueDataContract クラス AssetData に追加することで問題を修正しました。オブジェクト グラフには、AssetData クラスの他のインスタンスへの参照があります。ChildAssets メンバーは、AssetData の他のインスタンスへの単なる参照です。

于 2012-07-23T06:55:52.217 に答える