2010-04-03 46 views
3

我有一個應用程序的設置對象,它有兩個集合。這些集合很簡單包含一組屬性包的列表泛型。當我序列化,一切都被保存沒有問題:反序列化泛型集合 - 即將到來

XmlSerializer x = new XmlSerializer(settings.GetType()); 
TextWriter tw = new StreamWriter(@"c:\temp\settings.cpt"); 
x.Serialize(tw, settings); 

然而,當我反序列化,一切都恢復了除兩個集合(通過設置的制定者斷點驗證:

XmlSerializer x = new XmlSerializer(typeof(CourseSettings)); 
XmlReader tr = XmlReader.Create(@"c:\temp\settings.cpt"); 
this.DataContext = (CourseSettings)x.Deserialize(tr); 

什麼會導致這一點?一切都很香草......這裏是設置對象的一個​​片段...省略了大部分。PresentationSourceDirectory工作正常,但是PresentationModules的setter沒有命中:

private string _presentationSourceDirectory = string.Empty; 
public string PresentationSourceDirectory { 
    get { return _presentationSourceDirectory; } 
    set { 
    if (_presentationSourceDirectory != value) { 
     OnPropertyChanged("PresentationSourceDirectory"); 
     _presentationSourceDirectory = value; 
    } 
    } 
} 

private List<Module> _presentationModules = new List<Module>(); 
public List<Module> PresentationModules { 
    get { 
    var sortedModules = from m in _presentationModules 
         orderby m.ModuleOrder 
         select m; 
    return sortedModules.ToList<Module>(); 
    } 
    set { 
    if (_presentationModules != value) { 
     _presentationModules = value; 
     OnPropertyChanged("PresentationModules"); 
    } 
    } 
} 

回答

1

如果列表被反序列化,那麼setter從不會被調用。只是吸氣劑。 Deserializer只調用#Add()方法並將序列化的元素添加到exise List。這是Design的行爲。請參閱MSDN。
你可以添加一個新的屬性,讓你的列表沒有任何linq語句。 將[XmlIgnore]添加到現有屬性中,XmlSerializer將立即跳過此屬性。

[XmlIgnore] 
public List<Module> PresentationModules { 

創建暴露列表中的新特性:

private List<Module> _presentationModules = new List<Module>(); 
public List<Module> PresentationModulesList { 
    get { return _presentationModules; } 
} 

如果您分配一個新的列表屬性您在PresentationModules的二傳手事件只被調用。也許你應該讓制定者保密。

+0

好吧,這是有道理的,但我不清楚我的選擇是如何解決這個問題。看來我必須在修改我的對象後返回並實現自定義序列化程序/ de,以便它不會接受集合的setter ...是唯一的選擇嗎? – 2010-04-04 10:48:31

+0

我已經更新了我的答案。也許這就是你想要的。您在設置者中調用的事件是否是一項要求? – chriszero 2010-04-04 17:43:05

+0

感謝chriszero ......現在有些工作要做......非常感謝! – 2010-04-05 11:04:21

0

您可以覆蓋序列化和反序列化方法來添加自定義信息。自從我實現類似的東西已經有一段時間了,但我記得在接收到序列化數據後必須重寫以從對象中重建一些私有成員。