我有一系列的类,我在.NET 4.0中使用.NET的DataContractSerializer转换为XML . 序列化工作正常,我可以解析XML并在以后重新创建.NET对象而没有任何困难 .
但是,大多数DataMember都不是必需的 . [DataMember(IsRequired = false)] . 这非常适用于对XML进行反序列化,然后您可以在文档中错过XML节点,但是当将现有对象序列化为XML时,DataContractSerializer坚持将具有空值的属性写为具有属性的节点,例如:
[DataContract(Name = "response", Namespace = "http://domain.com/name")]
public class MyResponseClass
{
[DataMember(Name = "count", IsRequired = true, Order = 0)]
public int Count { get; set; }
[DataMember(Name = "info", IsRequired = false, Order = 1)]
public InfoClass Info { get; set; }
[DataMember(Name = "metadata", IsRequired = false, Order = 2)]
public MetadataList Metadatas { get; set; }
}
可以序列化
<response xmlns="http://domain.com/name">
<count>4</count>
</response>
但是,如果我序列化对象,它会创建:
<response xmlns="http://domain.com/name" xmlns:i="http://www.w3.org/2001/XmlSchema-instance">
<count>4</count>
<info i:nil="true" />
<metadata i:nil="true" />
</response>
当它具有空值时,有没有办法让DataContractSerializer不写节点?
2 回答
使用
EmitDefaultValue = false
跳过XML中的默认值:删除
xmlns:i="http://www.w3.org/2001/XmlSchema-instance"
你必须使用例如Replace()
,如下例所示带着敬意 :)
(我在错误的问题中意外地发布了这个答案,但我认为这也很有帮助,所以我现在不删除它)
在每个 class 的顶部使它更好 . 它删除了datacontract命名空间和丑陋的节点前缀 . 但是,标准名称空间保持不变 . 这对我的情况来说没问题 .
之前:
后: