有没有一种方法可以让DataContractSerializer使用ShouldSerialize*模式?
下面是一个小示例:
我有一个简单的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()
{
}
}仅当FirstName或LastName不为null或空时,才应序列化它们。这适用于XmlSerializer,但DataContractSerializer似乎忽略了ShouldSerialize模式。*Specified模式也不起作用。
我正在创建两个不同的Xml文件。一个使用DataContractSerializer,另一个使用XmlSerializer:
List<Person> persons = new List<Person>();
persons.Add (new Person("John", "Doe"));
persons.Add (new Person("Carl"));
DataContractSerializer serializer = new DataContractSerializer (typeof (List<Person>));
using (XmlWriter writer = XmlWriter.Create(@"c:\test1.xml", settings))
{
serializer.WriteObject (writer, persons);
}
XmlSerializer xmlSerializer = new XmlSerializer (typeof (List<Person>));
XmlWriter xmlWriter = XmlWriter.Create (@"c:\text2.xml", settings);
xmlSerializer.Serialize (xmlWriter, persons);
xmlWriter.Close();文件test1.xml (DataContractSerializer)的输出如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/XmlSerialization">
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person>
<FirstName>Carl</FirstName>
<LastName i:nil="true" />
</Person>
</ArrayOfPerson>文件test2.xml (XmlSerializer)的输出如下所示:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPerson xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
<Person>
<FirstName>Carl</FirstName>
</Person>
</ArrayOfPerson>发布于 2014-04-28 16:32:14
AFAIK,ShouldSerialize*不适用于数据合约序列化程序。在Kevin的回答中它是无用的。您可以将其删除。不幸的是,给定的代码只有在处理空值时才起作用。
这里有一个更通用的解决方案:它根据给定的条件返回空值。
[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;
}
}
}发布于 2012-07-09 20:02:55
您应该在DataMember上设置IsRequired属性:
[DataContract]
public class Person
{
[DataMember(IsRequired = False, EmitDefaultValue = False)]
public string FirstName { get; set; }
...
}https://stackoverflow.com/questions/11394587
复制相似问题