Nehmen wir an, dass das Framework irgendwie wissen müsste, welche Typen im Typ hiearchy sind, wenn Deserialisierung stattfindet, und wie diese Typen in xml dargestellt werden. Es hat wirklich keine Möglichkeit, diese Information abzuleiten, wenn sie in einem abgeleiteten Typ gespeichert ist.
Sie haben dann ein paar Optionen: - verwenden Sie das Attribut XmlInclude - geben Sie die Menge der erlaubten Typen in der XmlSerializer-Konstruktor überlasten
Nun, wenn Sie eine Unterklasse erwar um die übergeben werden Webservice steuert der Webserver die Serialisierung und Deserialisierung. Daher ist der XmlSerializer-Konstruktor keine Option mehr.
Wie Sie sagen, können Sie das Attribut auf die Webservice-Methode statt direkt auf die Klasse setzen. Es gibt einen Kompromiss zwischen dem Halten Ihrer Klasse "rein" und dem Erinnern, diese Attribute an jedem Ort zu platzieren, an dem sie benötigt werden.
Natürlich scheint das eigentliche Problem darin zu bestehen, dass Sie versuchen, Ihre Geschäftsobjekte als Nachrichtenformat in Ihrer Webservice-Schicht zu verwenden.
Wenn Sie die Zuständigkeiten "Nachrichtenformat" und "Geschäftsobjekt" wirklich trennen möchten, müssen Sie eine andere Klasse (mit der vollständigen Hierarchie) verwenden, die nur als Webservice-Parameter verwendet werden soll. In diesem Fall gibt es kein Problem damit, alle benötigten XmlInclude-Attribute in der Basisklasse festzuhalten. Wenn Sie dann zum Webservice wechseln, passen Sie Ihr Geschäftsobjekt an und von dem Nachrichtenformatobjekt an. Dies bietet den zusätzlichen Vorteil, dass Sie den Typen Ihrer Parameter keine Beschränkungen des Webservice-Typs zuweisen (z. B. keine Schnittstellen als Parameter).
Natürlich ist diese Methode nicht so praktisch.
Am Ende muss der Webservice wissen, welche Arten zu erwarten sind, oder es wird nicht in der Lage sein, sie richtig zu serialisieren und zu deserialisieren.
Und ja, das ist eine langatmige Erklärung, warum die Antwort nein ist, können Sie nicht nur das Attribut im abgeleiteten Typ behalten. Ich würde aber gerne falsch liegen :)