XmlSerializer "Angegebenen" suffix und IReflect
Habe ich entdeckt, dass wenn eine serialisierbare Feld/Eigenschaft hat ein entsprechendes Feld von Typ Boolean haben als Namen die Feld/Eigenschaft - name mit "Angegeben" - suffix, die die XmlSerializer-bedingt ausschließen, dass Feld/Eigenschaft aus dem serialisierungsprozess. Schön!
So, ich möchte vermeiden, die definition der Felder, und fügen Sie dynamisch, zur Laufzeit...
Lesen diese, fand ich eine interessante Schnittstelle IReflect, die ich verwenden können, um zu "emulieren" dynamische Felder, die verwendet werden, durch die die XmlSerializer-Instanzen zum Ausschluss bestimmter Felder.
Würde das funktionieren?
- Können Sie erläutern, warum Sie vermeiden möchten, die Felder und tun Sie dies an der Laufzeit? Wollen Sie zum serialisieren von Klassen ist unterschiedlich je nach einiger Laufzeit berechnete Werte, oder Sie wollen einfach nur, um das hinzufügen dieser zusätzlichen Eigenschaften?
- dies ist erstaunlich: framework-Autoren tatsächlich diese hardcoded in den tiefen der xml-serializer die Reflexion Motor. was für eine design-Entscheidung! wo ist dieser dokumentiert? referencesource.microsoft.com/#System.Xml/System/Xml/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, übernehmen Sie die Kontrolle Ihrer xml-Serialisierung dann haben Sie zwei Möglichkeiten. Die erste (die möglicherweise nicht angemessen sein, hier), dass die Attribute in das System.Xml.Serialization-namespace ausschließen Eigenschaften. Wenn Sie wirklich tun müssen, festzustellen, was wird serialisiert zur Laufzeit könnte dies nicht die beste Vorgehensweise.
Sehen Attribute, die Steuern, die die XML-Serialisierung
Den anderen Weg, dies zu tun ist, um zu implementieren, die die IXmlSerializable-Schnittstelle der Klasse und implementieren Sie die ReadXml und WriteXml-Methoden. Auf diese Weise können Sie Steuern, genau, wie deine xml aussieht. Sehen Sie, diese Frage für weitere Informationen:
benutzerdefinierte xml-Serialisierung
Jedoch, wie bereits erwähnt hier Mischen custom und basic-Serialisierung? einmal IXmlSerializable implementieren Sie Sie sind verantwortlich für die Serialisierung Logik für deinen Typ.
Werde ich verlängern Antwort von Martin Peck.
Sie können vermeiden, die Serialisierung der Felder/Eigenschaften, die mit "Angegebenen" suffix.
Sollten Sie definieren, dass "*Angegebenen" Eigenschaften in Ihrer Klasse und gelten
[XmlIgnoreAttribute()]
zu Ihnen.Hier ist ein Beispiel:
*Specified
Eigentum und müssen nicht eingestelltXmlIgnore
.Code-Beispiel, wie eine Erweiterung der zur Verfügung gestellten Antwort;
WSDL:
Generiert .net SOAP-client-Klasse
Können Sie "vehicleTypeFieldSpecified" = {true/false} zu {serialisieren/weglassen} es;
Resultierende SOAP-Nachricht;