2011-09-01 100 views
0

我都不再如下因素類:反序列化SortedSet:爲什麼項目需要實現IComparable?

[DataContract] 
public class MyProject 
{ 
    [DataMember(Name = "Branches")] 
    private SortedSet<ModuleFilter> branches = new SortedSet<ModuleFilter>(new ModuleFilterComparer()); 

    [DataMember(Name="VbuildFilePath")] 
    private string buildprogram = null; 
} 

我可以把它序列化到一個文件:

DataContractSerializer x = new DataContractSerializer(p.GetType()); 
using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(p.GetFilePath())) 
{ 
    x.WriteObject(writer, p); 
} 

但是當我嘗試與如下因素的代碼讀回,它失敗,除非我添加一個虛擬實現了IComparable到ModuleFilter對象

DataContractSerializer x = new DataContractSerializer(typeof(MyProject)); 
using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(filePath)) 
{ 
    p = (MyProject)x.ReadObject(reader); 
} 

爲什麼沒有解串器使用的SortedSet成員所提供的IComparer?

謝謝

回答

0

這是因爲DataContractSerializer的使用的SortedSet的默認構造函數初始化場。

解決方案1:重新反序列化後場需要比較器



    [DataContract] 
    public class MyProject : IDeserializationCallback 
    { 
     //... 
     void IDeserializationCallback.OnDeserialization(Object sender) 
     { 
     branches = new SortedSet<ModuleFilter>(branches, new ModuleFilterComparer()); 
     } 
    } 


解決方案2:使用您自己的有序set實現的,而不是SortedSet的<ModuleFilter>



    public class ModuleFilterSortedSet : SortedSet<ModuleFilter> 
     { 
      public ModuleFilterSortedSet() 
       : base(new ModuleFilterComparer()) 
      { 
      } 

      public ModuleFilterSortedSet(IComparer<ModuleFilter> comparer) 
       : base(comparer) 
      { 
      } 
     } 

相關問題