如何在 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;
}
}
将 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;
}
}