.NET XmlSerializer和通用SortedSet属性

本文关键字:SortedSet 属性 XmlSerializer NET | 更新日期: 2023-09-27 18:22:29

我有一个.net配置类:

public class Config {
  public SortedSet<string> SiteURLs { get; private set; }
  public Config() {
    SiteURLs = new SortedSet<string>();
  }
}

我正试图将其发送到XmlSerializer,但失败的原因是"反射类型时出错"。将[XmlIgnore]添加到SiteURLs属性可以序列化类。

我真的必须在这里编写自定义序列化代码吗?文档指出,只要该属性实现ICollection并提供"Add"方法,它就应该工作。也许我缺少一些其他必要的配置。

如何用.NET序列化/反序列化泛型的示例似乎都有自定义序列化。

.NET XmlSerializer和通用SortedSet属性

尝试将setter更改为public。

XmlSerializer不处理私有字段或受保护字段。

试试这个:

//
//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());
}