【问题标题】:How to serialize only part of a list in C#如何在 C# 中仅序列化列表的一部分
【发布时间】:2015-02-03 20:26:29
【问题描述】:

将 WPF 与 C# 结合使用,我正在寻找一种仅序列化列表的一部分的方法。我知道可以找出列表是否为空,并且仅在不是时才进行序列化。但是,我希望查看列表元素的成员,并根据它们的值对它们进行序列化或不序列化。

例如:从下面的类中,Sub2ClassType 类的列表“字段”中的元素只应在其成员“strValue”不等于“”时出现在 XML 中。

这可能吗?我尝试了各种方法,包括 Onserialize() 的代码,但无济于事。

namespace somenamespace
{
    [Serializable()]
    [XmlRoot(Namespace = "dashboard", ElementName = "dashboardSettings")]
    public class dashboardSettings
    {
        [XmlElement("sub1class", Namespace = "")]
        public Sub1Class sub1class{ get; set; }
    }

    public class Sub1Class
    {
        [XmlElement("sub2class")]
        public ObservableCollection<Sub2Class> sub2class{ get; set; }

        public Sub1Class()
        {
            sub2class = new ObservableCollection<Sub2Class>();
        }
    }

    public class Sub2Class : Patch
    {
        [XmlAttribute("name")]
        public string strName{ get; set; }
        [XmlElement("type")]
        public Sub2ClassType type{ get; set; }
    }

    public class Sub2ClassType
    {
        [XmlAttribute("name")]
        public string type{ get; set; }
        // These should only be serialized if member strValue != ""
        [XmlElement("elems", IsNullable = false)] 
        public ObservableCollection<Sub2ClassField> fields{ get; set; }

        public PatchTypeDetectionType()
        {
            fields = new ObservableCollection<Sub2ClassField>();
        }
    }

    public class Sub2ClassField
    {
        [XmlAttribute("field")]
        public string strField{ get; set; }
        [XmlAttribute("value")]
        public string strValue{ get; set; }

        public DSIField()
        {
            strField = "";
            strValue = "";
        }

        public override string ToString()
        {
            return strValue;
        }
    }
}

【问题讨论】:

  • 创建新的过滤列表并将其序列化。

标签: c# wpf serialization


【解决方案1】:

只需使用 Linq 过滤即可。

serializer.Serialize(mylist.Where(e => !String.IsNullOrEmpty(e.strValue)).ToList());

【讨论】:

  • 感谢@Kai Brummond 的快速回复。考虑到我在另一个列表中有一个列表,这是否也有效?到目前为止,我的序列化方法只是序列化主类,使用 XmlSerializer:serializer.Serialize(writer, dashboardSettingsInstance);
  • 不是真的,但请参阅@Ganesh 对这种情况的回答。
【解决方案2】:

您可以使用 ShouldSerialze。参考https://msdn.microsoft.com/en-us/library/53b8022e(v=vs.110).aspx

public class Sub2ClassField
{
    [XmlAttribute("field")]
    public string strField { get; set; }
    public bool ShouldSerializestrField()
    {
        return !string.IsNullOrEmpty(strValue);
    }
    [XmlAttribute("value")]
    public string strValue { get; set; }
    public bool ShouldSerializestrValue()
    {
        return !string.IsNullOrEmpty(strValue);
    }

    public Sub2ClassField()
    {
        strField = "";
        strValue = "";
    }

    public override string ToString()
    {
        return strValue;
    }
}

【讨论】:

  • 也谢谢@Ganesh。这部分可行,但仍会在生成的 XML 文件中留下一个空的 XmlElement(列表中的每个元素都有一个 )。这不是一个大问题,但最好完全省略这些元素。
猜你喜欢
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2015-09-08
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多