如何在某些条件下序列化某些属性

时间:2010-12-08 10:17:38

标签: c# .net xml-serialization

使用XML序列化序列化类时,如何有条件地输出某些属性。即在某些情况下,它输出此属性,在其他情况下,它不输出。

4 个答案:

答案 0 :(得分:13)

您可以创建一个名为MyPropertySpecified的附加属性,该属性返回一个布尔值 当此属性返回true时,将MyProperty属性序列化。当它返回false时,它不会被序列化。

此外,您还希望使用XmlIgnoreAttribute修饰该属性,以便不会序列化此特定属性。

示例:

public class Person
{
    public string Name
    {
        get;
        set;
    }

    [XmlIgnore]
    public bool NameSpecified
    {
        get  { return Name != "secret"; }
    }
}

答案 1 :(得分:4)

虽然有效并且是一个相当简短的解决方案,但propertyNameSpecified模式在我看来有一些缺点(污染类的接口;依赖于属性名称;引入隐式行为)。

如果您只需要实现一个简单的条件(例如,不要序列化默认值),那么DefaultValue属性是更好的选择。

例如:

public class PurchaseOrder
{
    [DefaultValue("2002")]
    public string Year;
}

如果Year的值为“2002”,则将从XML输出中省略它。

答案 2 :(得分:0)

您可以在序列化时使用 OnSerializingAttribute ,这允许我们在序列化之前调用方法。您可以获得有关它的更多信息here

答案 3 :(得分:0)

Imho您需要在类上实现IXmlSerializable并实现WriteXml和ReadXml方法,使得它们只根据您指定的条件编写属性,并且可以在反序列化时处理带有或不带有特定属性的读取。

IXmlSerializable at Msdn