2010-12-08 141 views

回答

13

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

此外,你想装饰该属性与XmlIgnoreAttribute,以便这个特定的属性不序列化。

例子:

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

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

我想你误解了这个问题。 OP想要输出属性(包含在xml中)。 – 2010-12-08 10:29:29

0

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

+0

这是否适用于xml序列化? – 2010-12-08 10:26:01

+0

除此之外,如果特定属性是值类型,他会怎么做?据我所知,在串行化过程中,OnSerializing可以用来设置值等,它不会改变属性将被序列化。我假设你期望空值不会被序列化,但是在值类型的情况下,属性中会有一个值,因此需要额外的工作来获得OP想要的行为,methinks。 – Anton 2010-12-08 11:35:00

0

恕我直言,你需要实现的类IXmlSerializable的和实施这样一种方式,他们只写根据条件您指定的属性,并能处理阅读中WriteXML和的ReadXml方法有或没有特定属性出现在反序列化中。

IXmlSerializable at Msdn

4

虽然作品,是一个相当短的解决方案,propertyNameSpecified模式在我看来,有一些缺点(污染类的接口;依靠属性名称;介绍了隐行为)。

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

例如:

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

如果年的值是 “2002”,它将从XML输出被省略。