ShouldSerialize模式和DataContractSerializer

有没有办法让ShouldSerialize*模式与DataContractSerializer一起使用?

这是一个小例子:

我有一个简单的类Person ,看起来像这样:

 [DataContract] public class Person { [DataMember] public string FirstName { get; set; } public bool ShouldSerializeFirstName() { return !string.IsNullOrEmpty(FirstName); } [DataMember] public string LastName { get; set; } public bool ShouldSerializeLastName() { return !string.IsNullOrEmpty(LastName); } public Person(string firstName, string lastName) { FirstName = firstName; LastName = lastName; } public Person(string firstName) { FirstName = firstName; } public Person() { } } 

FirstNameLastName不为null或为空,则只应序列化它们。 这适用于XmlSerializerDataContractSerializer似乎忽略了ShouldSerialize模式。 *Specified模式也不起作用。

我正在创建两个不同的Xml文件。 一个使用DataContractSerializer,一个使用XmlSerializer:

 List persons = new List(); persons.Add (new Person("John", "Doe")); persons.Add (new Person("Carl")); DataContractSerializer serializer = new DataContractSerializer (typeof (List)); using (XmlWriter writer = XmlWriter.Create(@"c:\test1.xml", settings)) { serializer.WriteObject (writer, persons); } XmlSerializer xmlSerializer = new XmlSerializer (typeof (List)); XmlWriter xmlWriter = XmlWriter.Create (@"c:\text2.xml", settings); xmlSerializer.Serialize (xmlWriter, persons); xmlWriter.Close(); 

test1.xml (DataContractSerializer)文件的输出如下所示:

    John Doe   Carl    

文件test2.xml (XmlSerializer)的输出如下所示:

    John Doe   Carl   

AFAIK,ShouldSerialize *不适用于datacontract序列化程序。 凯文的回答是没用的。 你可以删除它。 不幸的是,只有处理空值才能使代码有效。

这是一个更通用的解决方案:它根据给定条件返回null值。

  [DataContract] public class Person { private string firstName; [DataMember(IsRequired = false, EmitDefaultValue = false)] public string FirstName { get { //Put here any condition for serializing return string.IsNullOrWhiteSpace(firstName) ? null : firstName; } set { firstName = value; } } } 

您应该在DataMember上设置IsRequired属性:

 [DataContract] public class Person { [DataMember(IsRequired = False, EmitDefaultValue = False)] public string FirstName { get; set; } ... }