我有以下课程:
[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?
谢谢
答案 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)
{
}
}