WCF DataContract Ausschließen DataMembers Aus, die Serialisiert Werden, In Abgeleiteten Klassen
Ich habe eine base-Klasse mit DataMember-Eigenschaften in ihm. Ich habe auch eine abgeleitete Klasse mit dem DataMember-Eigenschaften in ihm. In meinem WCF-Projekt bin ich wieder der abgeleiteten Klasse. Gibt es eine Möglichkeit für mich, um zu verhindern, dass ein Mitglied in meiner Basisklasse, von serialisieren? Hier finden Sie einige Beispiel-code:
public class BaseClass
{
public string ShortDescription {get;set;}
public string LongDescription {get;set;}
}
public class DerivedClass : BaseClass
{
public List<Description> Descriptions {get;set;}
}
In diesem code möchte ich in der Lage sein sich zu verstecken die geerbten member Kurzbeschreibung und LongDescription, weil Sie die nun veraltet sind. Alle versuche, so zu tun, waren erfolglos. Hier ist was ich versucht habe:
public class DerivedClass : BaseClass
{
[DataMember]
public List<Description> Descriptions {get;set;}
//override the base class members
[IgnoreDataMember]
public override string ShortDescription {get;set;}
[IgnoreDataMember]
public override string LongDescription {get;set;}
}
und
public class DerivedClass : BaseClass
{
[DataMember]
public List<Description> Descriptions {get;set;}
//shadow the base class members
[IgnoreDataMember]
public new string ShortDescription {get;set;}
[IgnoreDataMember]
public new string LongDescription {get;set;}
}
Keiner dieser Ansätze funktioniert haben. Die "DerivedClass" geben, wenn die Ausgabe auf die WSDL enthält noch die "Ignorierte" Mitglieder der Basisklasse-Typ.
Kann man sich Fragen, warum bin ich nicht einfach die änderung der Basis-Klasse. Das ist, weil ich immer noch die Basis-Klasse in seine ursprüngliche form, wie in der vorherigen version von der Art, die für die WSDL zur Unterstützung der Abwärtskompatibilität für die Verbraucher. Auf diese Weise kann ich ein v1000-Aufruf zurückgibt, die BaseClass und ein V1010 nennen, gibt eine DerivedClass. Ich kann hinzufügen und ändern von Funktionen, um die DerivedClass alles was ich will, ohne das Potenzial für die Verbraucher der v1000-Funktionalität.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, die die [DataContract] Attribut zu beiden Klassen. Dies wird Ihnen sagen, die serializer zu betrachten, das [DataMember] und [IgnoreDataMember] - Attribute. Ohne die Klasse zugeschrieben mit [DataContract], alle öffentliche member serialisiert werden.
Auch, es wäre sogar besser, einen namespace hinzuzufügen, um Ihre datacontracts durch die Angabe in dem [DataContract(Namespace="...")] - Attribut. Brechen würde, dass alte Kunden telefonisch bei Ihrer aktualisierten service.
Schließlich fand ich einen geeigneten Weg, um diese Aufgabe zu bewältigen. Ich habe nicht den code vor mir, so werde ich Flügel der syntax. Es ist eine ziemlich einfache Lösung, aber es löst das spezifische Problem, das ich hatte.
Badda-bing! Ziemlich einfach, aber es ist das, was ich brauchte.
Versuchen Sie dies:
EDIT: Vielleicht nutzen Nachricht Verträge, die eine präzise Steuerung der Serialisierung funktionieren könnte: http://msdn.microsoft.com/en-us/library/ms730255.aspx
Andernfalls können Sie auch einen Blick in die Implementierung eines 'WCF-Router", die Ihnen erlauben würde, verwenden Sie den gleichen Endpunkt, aber die route, die verschiedene Versionen für verschiedene Dienste.