【问题标题】:.NET XmlSerializer and generic SortedSet properties.NET XmlSerializer 和通用 SortedSet 属性
【发布时间】:2012-02-02 16:43:22
【问题描述】:

我有一个 .net 配置类:

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

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

我正在尝试将其发送到 XmlSerializer,它失败并显示“存在错误反映类型”。将 [XmlIgnore] 添加到 SiteURLs 属性允许对类进行序列化。

我真的必须在这里编写自定义序列化代码吗?文档表明,只要该属性实现 ICollection 并提供“添加”方法,它就应该可以工作。也许我错过了一些其他必要的配置。

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

【问题讨论】:

标签: c# generics xml-serialization


【解决方案1】:

尝试将 setter 更改为 public。

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

【讨论】:

  • 如果是重点,Config 会序列化但没有它的成员,但事实并非如此,会引发异常。
  • 尝试查看内部异常。它在说什么?
  • .NET 新手,我是。 InnerException 是“您必须在 System.Collections.Generic.SortedSet`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 上实现默认访问器,因为它继承自 ICollection。”} .太糟糕了 SortedSet 没有实现这样的访问器。简单类型的泛型集合很常见。
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2011-03-16
    • 2012-07-31
    相关资源
    最近更新 更多