如何在 C# 中仅序列化列表的一部分

How to serialize only part of a list in C#

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

例如:在下面的 class 中,class Sub2ClassType 的列表 "fields" 中的元素仅当其成员 "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;
        }
    }
}

只需使用 Linq 对其进行过滤即可。

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

您可以使用 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;
    }
}