5

.NET4.0で.NETのDataContractSerializerを使用してXMLに変換する一連のクラスがあります。シリアル化は正常に機能しており、XMLを解析して、後で問題なく.NETオブジェクトを再作成できます。

ただし、ほとんどのDataMemberは必須ではありません。[DataMember(IsRequired = false)]。これは、XMLの逆シリアル化に最適です。この場合、ドキュメントからXMLノードを見逃す可能性がありますが、既存のオブジェクトをXMLにシリアル化する場合、DataContractSerializerは、null値を持つプロパティを属性を持つノードとして書き出すことを要求します。

[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>

データがnull値の場合に、代わりにノードを書き込まないようにDataContractSerializerを取得する方法はありますか?

4

2 に答える 2

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; }
}

削除するには、たとえば次の例のように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);
    }
}

に関して:)

于 2013-02-18T10:07:40.567 に答える
1

(この回答を誤って間違った質問に投稿しましたが、ここでも役立つと思いますので、今は削除しません)

[DataContract(Namespace = "")]

各クラスの上にそれをとても良くします。datacontract名前空間と醜いノードプレフィックスを削除します。ただし、標準の名前空間はそのままです。私の場合は問題ありませんでした。

前:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://schemas.datacontract.org/2004/07/MyClassname">
  <prop1>true</prop1>
  <prop2 xmlns:d2p1="http://schemas.datacontract.org/2004/07/MySubclassname">
    <d2p1:sub>true</d2p1:sub>
  </prop2>
</root>

後:

<?xml version="1.0" encoding="utf-8"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <prop1>true</prop1>
  <prop2>
    <sub>true</sub>
  </prop2>
</root>
于 2016-09-27T14:53:25.823 に答える