繁体   English   中英

如何不基于属性的值序列化对象?

[英]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序列化的模式。 在这里您可以将XmlArrayXmlArrayItem用于列表等(具有给定名称),然后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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM