[英]How to not serialize an object based on a property's value?
如果标签没有给出,我正在使用C#的XmlSerializer类。
举例来说,我有一个Person类,该类具有各种属性,包括年龄(int),名称(string)和已故(bool)。 有没有一种方法可以指定我不想序列化任何已故标记为true的对象?
编辑:我应该已经指定了,但是不幸的是,由于这种情况,我无法真正编辑对象列表,因为它是另一个类的成员,而这实际上是我要序列化的对象。 还有其他建议吗?
假设您具有以下类结构类型(如您在注释中所指定)
public class Person
{
public int Age { get; set; }
public string Name { get; set; }
public bool Deceased { get; set; }
}
public class Being
{
public string Data { get; set; }
[XmlElement("Human")]
public Person Human { get; set; }
public bool ShouldSerializeHuman()
{
return !this.Human.Deceased;
}
}
在这里,我添加了一个名为ShouldSerialize
的方法,该方法称为XML序列化的模式。 在这里您可以将XmlArray
和XmlArrayItem
用于列表等(具有给定名称),然后ShouldSerialize
检查它是否可以序列化。
以下是我用于测试的代码。
private static void Main(string[] args)
{
var livingHuman = new Person() { Age = 1, Name = "John Doe", Deceased = true };
var deadHuman = new Person() { Age = 1, Name = "John Doe", Deceased = false };
XmlSerializer serializer = new XmlSerializer(typeof(Being));
serializer.Serialize(Console.Out, new Being { Human = livingHuman, Data = "new" });
serializer.Serialize(Console.Out, new Being { Human = deadHuman, Data = "old" });
}
这是输出:
============================
更新:
如果您有“人为人”列表:
public class Being
{
// [XmlAttribute]
public string Data { get; set; }
// Here add the following attributes to the property
[XmlArray("Humans")]
[XmlArrayItem("Human")]
public List<Person> Humans { get; set; }
public bool ShouldSerializeHumans()
{
this.Humans = this.Humans.Where(x => !x.Deceased).ToList();
return true;
}
}
样品测试:
private static void Main(string[] args)
{
var livingHuman = new Person() { Age = 1, Name = "John Doe", Deceased = true };
var deadHuman = new Person() { Age = 1, Name = "John Doe", Deceased = false };
var humans = new List<Person> { livingHuman, deadHuman };
XmlSerializer serializer = new XmlSerializer(typeof(Being));
serializer.Serialize(Console.Out, new Being() { Humans = humans, Data = "some other data" });
}
输出:
如果您有一个Person
对象列表,并且只想序列化其中的一些对象,那么只需过滤掉不需要的对象即可。 例如:
List<Person> people = GetPeople(); //from somewhere
List<Person> filteredPeople = people.Where(p => !p.Deceased);
现在,您只需要序列化filteredPeople
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.