反序列化SortedSet:为什么项目需要实现IComparable?

发布于 2024-12-02 05:59:02 字数 898 浏览 0 评论 0原文

我有以下类:

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

为什么解串器不使用SortedSet 成员提供的 IComparer ?

谢谢

I have de folowing classes :

[DataContract]
public class MyProject 
{
    [DataMember(Name = "Branches")]
    private SortedSet<ModuleFilter> branches = new SortedSet<ModuleFilter>(new ModuleFilterComparer());

    [DataMember(Name="VbuildFilePath")]
    private string buildprogram = null;
}

I can serialize it to a file with :

DataContractSerializer x = new DataContractSerializer(p.GetType());
using (System.Xml.XmlWriter writer = System.Xml.XmlWriter.Create(p.GetFilePath()))
{
    x.WriteObject(writer, p);
}

But when I try to read it back with the folowing piece of code, it fails unless I add a dummy implementation of IComparable to the ModuleFilter object

DataContractSerializer x = new DataContractSerializer(typeof(MyProject));
using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(filePath))
{
    p = (MyProject)x.ReadObject(reader);
}

Why does not the deserializer use the provided IComparer of the SortedSet member ?

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆流 2024-12-09 05:59:02

这是因为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)
            {
            }
        }

It is because DataContractSerializer uses default constructor of SortedSet to initialize field.

Solution 1: recreate field after deserialization with needed comparer



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

Solution 2: use your own sorted set implementation instead of SortedSet<ModuleFilter>



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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文