13

新しい.NET3.0DataContractSerializerを使用しています。シリアル化する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>

実際、上記のファイルはシリアライザーで正常に逆シリアル化されます。

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

4

2 に答える 2

24

でフィールドをマークします

   [DataMember(EmitDefaultValue=false)]

これは、少なくとも null 許容値型の場合に機能します。List の場合、必要になるまでリストの作成を延期する必要がある場合があります。そうしないと、シリアル化の前にメンバーが空の場合は null になります。

于 2009-04-01T23:51:32.593 に答える
1

私は本当に同じことを必要としていましたが、生成された 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);
    }
于 2013-03-28T19:00:41.080 に答える