我有持有泛型列表類團隊:WCF:序列化和反序列化泛型集合
[DataContract(Name = "TeamDTO", IsReference = true)]
public class Team
{
[DataMember]
private IList<Person> members = new List<Person>();
public Team()
{
Init();
}
private void Init()
{
members = new List<Person>();
}
[System.Runtime.Serialization.OnDeserializing]
protected void OnDeserializing(StreamingContext ctx)
{
Log("OnDeserializing of Team called");
Init();
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerializing]
private void OnSerializing(StreamingContext ctx)
{
Log("OnSerializing of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnDeserialized]
protected void OnDeserialized(StreamingContext ctx)
{
Log("OnDeserialized of Team called");
if (members != null) Log(members.ToString());
}
[System.Runtime.Serialization.OnSerialized]
private void OnSerialized(StreamingContext ctx)
{
Log("OnSerialized of Team called");
Log(members.ToString());
}
當我在一個WCF服務中使用這個類,我獲得以下日誌輸出
OnSerializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnSerialized of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserializing of Team called
System.Collections.Generic.List 1[XXX.Person]
OnDeserialized of Team called
XXX.Person[]
反序列化後members
是一個數組,不再是通用列表,雖然字段類型是IList <>(?!) 當我嘗試通過WCF服務發送此對象時,我得到日誌輸出
OnSerializing of Team called
XXX.Person[]
之後我的單元測試崩潰了System.ExecutionEngineException,這意味着WCF服務無法序列化數組。 (也許是因爲它預計IList <>)
所以,我的問題是:有人知道爲什麼我的IList <>是反序列化後的數組,爲什麼我不能序列化我的Team對象之後?
感謝
謝謝。真的很難找出「我」可能會產生什麼影響。與此同時,我發現了另一種解決方案,特別是當您需要IList <>而不是List <>時(例如,我的OR-Mapper只能處理IList <>而不是List <>):而不是用[ DataMember]標記屬性並使用此代碼作爲setter:if(value!= null)members = new List(value); else members = new List (); 用這個反序列化數組傳遞給setter,它從中創建一個新List。 –
Fabiano
2010-04-06 08:59:32
後一種技術是我總是這樣做的。該成員字段不是序列化程序應該觸及的東西。 – IDisposable 2012-04-13 19:55:51
我第二個屬性的方法!我很傷心,我沒有想到自己。 – codechurn 2012-11-06 21:16:37