Kann ich die DataContractSerializer nicht erstellen optional (d Nullable <> und List <>) Elemente in XML-Ausgabe konfigurieren?

StackOverflow https://stackoverflow.com/questions/707711

  •  22-08-2019
  •  | 
  •  

Frage

Ich bin mit dem neuen .NET 3.0 DataContractSerializer. Ich habe beide Nullable << em >> und << Liste / em >> Objekte ich serialisiert werde. Beispiel:

[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>();
}

Wenn .NET eine Null oder eine leere Liste serialisiert, bringt es auf null (für Nullable) und leer (für Listen) Elemente in die XML. Das obige Beispiel erzeugt:

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

Aus Gründen Ich habe keine Zeit ich zu beschreiben, haben möchte, die überflüssigen NullableNumber und Zahlen Elemente beseitigen, etwa so:

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

Tatsächlich ist die obige Datei deserialisiert mit dem Serializer gut.

Vielen Dank für Ihre Hilfe!

War es hilfreich?

Lösung

Markieren Sie das Feld mit

   [DataMember(EmitDefaultValue=false)]

Das funktioniert für zumindest den Nullable-Wertetyp Fall. Für die Liste Fall müssen Sie Erstellung der Liste verschieben, bis es gebraucht wird, oder auch das Null-Mitglied, wenn es leer ist, bevor die Serialisierung ist.

Andere Tipps

ich wirklich die gleiche Sache benötigt, sondern global zu viele Felder in den generierten RIA Klassen angewendet. Ich bin mir nicht sicher, ob dies XML DataConstract für Deserialisieren akzeptabel ist. Aber es ist lesbar, was meine Zwecke Suiten ...

    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);
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top