2011-09-01 65 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) 
      { 
      } 
     } 

相关问题