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