Wie kann ich den DataContractSerializer EmitDefaultValue = false global über app.config oder web.config oder auf andere Weise angeben?

9

Ich habe eine sehr große Klassenbibliothek mit & gt; 100 POCO-Objekten. Ich muss diese Objekte in XML serialisieren, um sie an einen REST-Service zu senden.

Ich habe versucht, DataContractSerializer zu verwenden, aber es gibt XML-Elemente mit i:nil="true" für alle Eigenschaften aus, die null sind. Dies löst den REST-Dienst aus, an den ich XML übertrage. Ja, mir ist klar, dass es nicht so sein sollte. Der Dienstanbieter hat mich darüber informiert, dass die Behebung des Problems Monate dauern wird. Ich habe keine Monate zu warten, bis dieser Dienst funktioniert.

Ich habe die Dokumentation durchforstet, um einen Weg zu finden, die Übertragung dieser Objekte zu unterdrücken. Ich bin mir bewusst, dass ich die festlegen könnte EmitDefaultValue-Eigenschaft für jede einzelne Eigenschaft jedes POCO-Objekts auf false. Ich werde das nicht für mehr als 100 Objekte tun, wenn ich keine andere Wahl habe. Außerdem glaube ich nicht, dass ich gezwungen werden sollte, meine Klassenbibliotheksobjekte mit DataContract-Attributen zu kommentieren. Ich möchte meine Klassenbibliothek auch nicht mit DataContractSurrogates spiegeln. Das ist nur obszön.

Frage

Sicherlich gibt es irgendwo eine Konfigurationsoption, bei der ich angeben kann, dass das Standardverhalten für die Serialisierung EmitDefaultValue = false sein soll. Ich konnte es jedoch nicht finden. Ich hoffe, jemand anderes hat es gefunden, oder hat eine andere globale Option gefunden, um die Null-Eigenschaften aus dem XML zu unterdrücken.

  • Kann dies in app.config / web.config?
  • angegeben werden
  • Oder kann es in der DataContractSerializer -Instanz festgelegt werden?

Wenn das nicht existiert, scheint es eine große Kontrolle von Microsoft zu sein.

    
crush 06.05.2014, 17:11
quelle

1 Antwort

4

Ich glaube, dass es keine offizielle Möglichkeit gibt, diese Eigenschaft global festzulegen, vielleicht weil sie als in den meisten Fällen nicht empfohlen .

Aber es gibt einen Workaround. Sie können Ihren eigenen DataMemberAttribute im Namensraum System.Runtime.Serialization definieren, wobei EmitDefaultValue standardmäßig auf false gesetzt wird. Stell es irgendwo in dein Projekt. Und das ist alles, was Sie tun müssen. Der Compiler gibt Ihnen eine Warnung, dass Ihr Typ mit dem importierten Konflikt in Konflikt steht, aber Ihren Typ schließlich verwendet. Ich nahm diese Klasse von Microsoft-Quellen und setzte EmitDefaultValue auf false und ersetze Exception-throw in der Reihenfolgeprüfung, da es die interne Dienstprogrammklasse verwendet:

%Vor%

Wenn wir jetzt new Foo() nehmen:

%Vor%

Es wird von DataContractSerializer als:

serialisiert %Vor%     
Leonid Vasilyev 21.07.2015 23:07
quelle

Tags und Links