.NET XmlSerializer и общие свойства SortedSet - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть класс конфигурации .net:

public class Config {
  public SortedSet<string> SiteURLs { get; private set; }

  public Config() {
    SiteURLs = new SortedSet<string>();
  }
}

Я пытаюсь отправить его на XmlSerializer, который завершается с ошибкой «Произошла ошибка, отражающая тип».Добавление [XmlIgnore] к свойству SiteURLs позволяет сериализовать класс.

Должен ли я написать собственный код сериализации здесь?Документы указывают, что пока свойство реализует ICollection и предоставляет метод «Добавить», оно должно работать.Возможно, мне не хватает какой-то другой необходимой конфигурации.

Примеры того, как сериализовать / десериализовать дженерики с помощью .NET, кажется, повсюду имеют пользовательскую сериализацию.

Ответы [ 2 ]

0 голосов
/ 07 января 2015

Попробуйте это:

//
//some example class
//
public class Music: IComparable<Music>
{
    public Music() { }
    public string Author { get; set; }
    public string Name { get; set; }

    public int CompareTo(Music other)
    {
        if (Author == other.Author)
        {
            return Name.ToUpper().CompareTo(other.Name.ToUpper());
        }
        else
        {
            return Author.ToUpper().CompareTo(other.Author.ToUpper());
        }
    }
}

//
// that is to deserialize
//
var musics = new SortedSet<Music>();
var mPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + "\\j.txt";
if (File.Exists(mPath))
{
    File.Copy(mPath, mPath.Replace(".txt", DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".txt"));
    var ser = new XmlSerializer(typeof(List<Music>));
    using (var sr = new StreamReader(mPath))
    {
        musics = new SortedSet<Music>((List<Music>)ser.Deserialize(sr));
    }
}

//
// that is to serialize
//
var ser = new XmlSerializer(typeof(List<Music>));

using (var wri = new StreamWriter(mPath))
{
    ser.Serialize(wri, musics.ToList());
}
0 голосов
/ 02 февраля 2012

Попробуйте изменить сеттер на общедоступный.

XmlSerializer не обрабатывает частные или защищенные поля.

...