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

时间:2015-02-03 20:26:29

标签: c# wpf serialization

将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;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

只需使用Linq过滤它。

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

答案 1 :(得分:1)

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