Allgemein akzeptierte Weg, um zu vermeiden KnownType-Attribut für jede abgeleitete Klasse
Gibt es einen allgemein anerkannten Weg, um zu vermeiden, dass du KnownType-Attribute auf WCF-Dienste? Ich habe getan, einige der Forschung, und wie es aussieht, gibt es zwei Möglichkeiten:
Ich bin kein großer fan von mit zu statisch hinzufügen KnownType-Attribute jedes mal, wenn ich einen neuen Typ, daher wollte es vermeiden.
Gibt es eine Dritte option, die verwendet werden sollte? Wenn dem so ist, was ist es? Wenn nicht, welche der beiden oben genannten Optionen sind der richtige Weg zu gehen?
Bearbeiten - verwenden Sie eine Methode
Eine Dritte Möglichkeit wäre die Verwendung von Reflexion
[DataContract]
[KnownType("DerivedTypes")]
public abstract class FooBase
{
private static Type[] DerivedTypes()
{
return typeof(FooBase).GetDerivedTypes(Assembly.GetExecutingAssembly()).ToArray();
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich posten wollte, was scheint die einfachste, eleganteste Lösung, die ich denken kann, so weit. Wenn eine andere Antwort kommt, die ist besser, ich gehe mit, dass. Aber für jetzt, das funktionierte gut.
Basis-Klasse, mit nur eine
KnownType
Attribut den Verweis auf eine Methode namensDerivedTypes()
:Den
GetDerivedTypes()
Methode, in einem separaten ReflectionUtility Klasse:return Assembly.GetExecutingAssembly().GetTypes().Where(_ => _.IsSubclassOf(typeof(TaskBase))).ToArray();
Die Methode erwähnt, von Bob funktioniert, solange alle beteiligten Klassen in der gleichen assembly.
Folgende Methode funktioniert über Baugruppen:
Können Sie die IXmlSerializable implementieren in Ihre benutzerdefinierten Typen und Griff Ihrer Komplexität manuell.
Folgenden finden Sie ein Beispiel-code:
Hoffe, es hilft.
Wenn Sie nicht wie die Attribute überall danach können Sie mithilfe von configuration-Datei.
Hier ist meine Variante auf die akzeptierte Antwort:
Die Unterschiede sind:
Ich würde lieber extrahieren Sie meine benutzerdefinierte Typen alle auf einmal und verwenden Sie es während der Serialisierung/Deserialisierung. Nach der Lektüre dieses post, es dauerte eine Weile, um zu verstehen, wo zu injizieren und diese Liste von Arten, nützlich zu sein für die Objekt-Serialisierung. Die Antwort war ganz einfach: diese Liste ist als einer der Eingabe-Argumente der Konstruktor der serializer-Objekt.
1 - ich bin mit zwei statischen, generischen Methoden für die Serialisierung und Deserialisierung, dies kann mehr oder weniger wie andere auch, die den job tun, oder zumindest ist es sehr übersichtlich für die Herstellung Vergleich mit dem code:
2 - Bitte achten Sie auf Konstruktor der DataContractSerializer. Wir haben ein zweites argument gibt es, das ist der Einstiegspunkt für die Injektion Ihre bekannten Typen um Objekt-Serialisierung.
3 - ich bin eine statische Methode für das extrahieren von all meinen eigenen definierten Typen aus meiner eigenen Baugruppen. den code für diese statische Methode könnte wie folgt Aussehen:
Da war ich nicht beteiligt WCF (ich brauchte nur eine binäre Serialisierung für die Datei-operation), meine Lösung kann nicht genau auf die WCF-Architektur, aber es muss Zugriff auf Konstruktor der serializer-Objekt von irgendwo.