避免在.Net DataContractSerializer中使用"http://www.w3.org/2001/XMLSchema-instance"命名空间

Mic*_*haw 5 .net c# xml datacontractserializer netdatacontractserializer

我有一系列的类,我在.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; }

}
Run Code Online (Sandbox Code Playgroud)

可以序列化

<response xmlns="http://domain.com/name">
    <count>4</count>
</response>
Run Code Online (Sandbox Code Playgroud)

但是,如果我序列化对象,它会创建:

<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>
Run Code Online (Sandbox Code Playgroud)

当它具有空值时,有没有办法让DataContractSerializer不写节点?

Jer*_*ler 10

使用EmitDefaultValue = falseXML中跳过的默认值:

[DataContract(Name = "response", Namespace = "http://domain.com/name")]
public class MyResponseClass 
{
    [DataMember(Name = "count", IsRequired = true, Order = 0, EmitDefaultValue = false)]
    public int Count { get; set; }

    [DataMember(Name = "info", IsRequired = false, Order = 1, EmitDefaultValue = false)]
    public InfoClass Info { get; set; }

    [DataMember(Name = "metadata", IsRequired = false, Order = 2, EmitDefaultValue = false)]
    public MetadataList Metadatas { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

删除xmlns:i="http://www.w3.org/2001/XmlSchema-instance"你必须使用例如Replace()在以下示例中

public void Write(string filePath, MyResponseClass myResponse)
{
    var serializer = new DataContractSerializer(typeof(MyResponseClass));

    var sb = new StringBuilder();
    using (var writer = new StringWriter(sb))
    using (var xmlWriter = XmlWriter.Create(writer))
    {
        serializer.WriteObject(xmlWriter, myResponse);
    }

    using (StreamWriter stream = new StreamWriter(filePath))
    {
        sb = sb.Replace(" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
        stream.Write(sb);
    }
}
Run Code Online (Sandbox Code Playgroud)

带着敬意 :)

  • `String.Replace`用于删除它看起来像一个黑客.有更好的选择吗? (6认同)