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。
繼續學習中,先留下一筆。