1. 程式人生 > >WCF複雜型別引數傳輸

WCF複雜型別引數傳輸

 最近做一專案,服務端與客戶端的通訊是使用WCF,發現WCF傳輸複雜物件時有點麻煩,比如巢狀的類,列表等,網上找了些資料,結合自己的程式,記錄在此。

 服務端需要給客戶端返回一個訂單的菜品列表(OrderItem),每種菜要以有多種口味(TasteItem)。

1.首先需要將TasteItem定義可序列化的資料契約,如下

[Serializable]
    [DataContract]

    public class TasteItem
    {
        private string tasteGroupCode;
        [DataMember(IsRequired = true)]
        public string TasteGroupCode
        {
            get { return tasteGroupCode; }
            set { tasteGroupCode = value; }
        }
        private string tasteCode;
        [DataMember(IsRequired = true)]
        public string TasteCode
        {
            get { return tasteCode; }
            set { tasteCode = value; }
        }
        private string tasteName;
        [DataMember(IsRequired = true)]
        public string TasteName
        {
            get { return tasteName; }
            set { tasteName = value; }
        }
    }

2.在 OrdderItem裡使用TasteItem:

    [Serializable]
    [DataContract]
    [KnownType(typeof(TasteItem))]

    //[DataContract]
    public class OrderItem : IEnumerable<TasteItem>
    {
        string code;

        [DataMember(IsRequired = true)]
        public string Code
        {
            get { return code; }
            set { code = value; }
        }

        string name;

        [DataMember(IsRequired = true)]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

         //口味列表
        [DataMember(IsRequired = true)]
        public IList<TasteItem> tasteList;

        public OrderItem()
        {
            tasteList = new List<TasteItem>();
        }
        public void Add(TasteItem obj)
        {
            tasteList.Add(obj);
        }
        public IEnumerator<TasteItem> GetEnumerator()
        {
            return tasteList.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return tasteList.GetEnumerator();
        }

    }

 在網上找了些資料總結了一下,需要注意的地方有以下:

1.OrderItem前面要註明[KnownType(typeof(TasteItem))]和 [Serializable]

2.網上有的例子,在OrderItem裡用的是CollectionDataContract,但我這OrderItem裡還有其他的不是列表的屬性,所以依然用DataContract

3.OrderItem必須要實現IEnumerable介面

4.記得要在建構函式裡建立list。

繼續學習中,先留下一筆。