c# - 後継 - 出力 XML でオプション(Nullable<> および List<>) 要素を作成しないように DataContractserializer を構成できますか。




json 後継 (2)

でフィールドをマーク

   [DataMember(EmitDefaultValue=false)]

それは少なくともnull値の型の場合にはうまくいくでしょう。 Listの場合は、必要になるまでリストの作成を遅らせる必要があります。それ以外の場合は、シリアル化の前にメンバーが空の場合はnullになります。

https://code.i-harness.com

私は新しい.NET 3.0 DataContractSerializerを使用しています。 私はシリアル化しようとしているNullable < >とList < >オブジェクトの両方を持っています。 例:

[DataContract(Namespace = "")]
class Test
{
    public static void Go()
    {
        Test test = new Test();

        var dcs = new DataContractSerializer(typeof(Test));
        dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test);
    }

    [DataMember]
    public Nullable<int> NullableNumber = null;

    [DataMember]
    public int Number = 5;

    [DataMember]
    public List<int> Numbers = new List<int>();
}

.NETがnullまたは空のリストをシリアル化すると、nil(Nullableの場合)およびempty(リストの場合)要素がXMLに入れられます。 上記の例は以下を生成します。

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <NullableNumber i:nil="true"/>
  <Number>5</Number>
  <Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</Test>

説明する時間がないので、余計なNullableNumber要素とNumbers要素を削除したいと思います。

<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Number>5</Number>
</Test>

確かに、上記のファイルはシリアライザを使用して逆シリアル化しても問題ありません。

ご協力いただきありがとうございます!


私は本当に同じことを必要としていましたが、生成されたRIAクラスの多くのフィールドにグローバルに適用されました。 このXMLが逆シリアル化のためにDataConstractに受け入れられるかどうかはわかりません。 しかし、それは読みやすく、私の目的に合っています...

    public override string ToString()
    {
        var doc = XDocument.Parse(this.ToXML());
        WalkElement(doc.Root);
        return doc.ToString( SaveOptions.None );
    }
    void WalkElement(XElement e)
    {
        var n = e.GetNamespaceOfPrefix("i");
        if (n != null)
        {
            var a = e.Attribute(n + "nil");
            if (a != null && a.Value.ToLower() == "true")
                e.Remove();
        }
        foreach (XElement child in e.Elements().ToList())
            WalkElement(child);
    }




datacontractserializer