десериализация SortedSet: почему элементы должны реализовывать IComparable? - PullRequest
0 голосов
/ 01 сентября 2011

У меня есть следующие классы:

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

Почему десериализатор не использует предоставленный IComparer члена SortedSet?

Спасибо

1 Ответ

0 голосов
/ 02 сентября 2011

Это потому, что DataContractSerializer использует конструктор по умолчанию SortedSet для инициализации поля.

Решение 1: воссоздать поле после десериализации с помощью необходимого компаратора



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


Решение 2: используйте собственную реализацию отсортированного набора вместо SortedSet



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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...