反序列化SortedSet:为什么项需要实现IComparable?

时间:2011-09-01 12:45:43

标签: c#-4.0

我有以下课程:

[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);
}

但是当我尝试用下面的代码读回来时,它会失败,除非我向ModuleFilter对象添加IComparable的虚拟实现

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

为什么反序列化器不使用SortedSet成员提供的IComparer?

谢谢

1 个答案:

答案 0 :(得分:0)

这是因为DataContractSerializer使用SortedSet的默认构造函数来初始化字段。

解决方案1:使用所需的比较器重新序列化后重新创建字段



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


解决方案2:使用您自己的排序集实现而不是SortedSet&lt; ModuleFilter&gt;



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

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