Hallo,
ich habe eine WCF-Schnittstelle mit einer Funktion, die eine List<PV> erwartet.
PV ist eine Klasse aus meinem Projekt. Von PV sind noch weitere Klassen abgeleitet, z.B. PVDigitalIn.
Wenn ich nun eine List<PV> mit einigen PVDigitalIn-Objekten fülle und die Funktion aus meinem WCF-Service damit aufrufe erhalte ich immer folgende Exception:
Fehler beim Deserialisieren von Parameter http://tempuri.org/:pvs. Die InnerException-Nachricht war "Der Typ 'xxxxx.PVDigitalIn' mit dem Datenvertragsnamen 'PVDigitalIn:http://schemas.datacontract.org/2004/07/xxxxx' wird nicht erwartet. Verwenden Sie ggf. einen DataContractResolver, oder fügen Sie alle unbekannten Typen statisch der Liste der bekannten Typen hinzu, beispielsweise mithilfe des KnownTypeAttribute-Attributs oder indem Sie sie zur Liste der bekannten Typen hinzufügen, die an DataContractSerializer übergeben wird.". Weitere Details finden Sie unter "InnerException".
Das KnownType-Attribut habe ich für die abgeleiteten Klassen bereits gesetzt, ändert aber nix.
Wie kann ich die Liste übergeben ?
Gruß Dominik
Hallo,
in der Fehlermeldung steht schon eigentlich alles drin.
Du musst den abgeleiteteten Typ für die Serialisierung bekannt machen, das geht über das KnownType-Attribute.
mfg
serial
Hallo,
vielleicht kannst du ja mal den entsprechenden quellcode der Basisklasse bzw des Dienstvertrages zeigen.
mfg
serial
Hallo serial,
erstmal vielen Dank für deine Hilfe!
POCO-Code ist kein Problem, da stehen ja keine Geheimnisse drin 😃
Hier erstmal die Basisklasse. Habe jetzt mal nur die ersten 3 Properties mit rein genommen, damit das Listing nicht zu lang wird. Kann bei Bedarf auch alles rein packen
namespace HST.SCADA.Domain.PV
{
[Serializable]
[DataContract]
public class PV : Object
{
[DataMember]
public int ID { get; set; }
[DataMember]
public PvTypen PVTyp { get; set; }
[DataMember]
public string PVName { get; set; }
public PV()
{
this.PVTyp = PvTypen.Undefined;
this.MinDEInterval = 1;
this.MaxDEInterval = 0;
this.DigitLowerLimit = 0;
this.DigitUpperLimit = 1;
this.ValueRangeUpperLimit = 1;
this.ValueRangeLowerLimit = 0;
this.Source = "";
this.Unit = new PvUnit();
this.State = PvStates.Enabled;
}
Dann die abgeleitete Klasse:
namespace HST.SCADA.Domain.PV
{
[Serializable]
[DataContract]
[KnownType(typeof(PV))]
public class PVDigitalIn : PV
{
public string MessageText { get; set; }
public string MessageTextExtensionActive { get; set; }
public string MessageTextExtensionInactive { get; set; }
public PVDigitalIn()
{
this.PVTyp = PvTypen.DigitalIn;
this.MinDEInterval = 1;
this.MaxDEInterval = 0;
this.DigitLowerLimit = 0;
this.DigitUpperLimit = 1;
this.ValueRangeLowerLimit = 0;
this.ValueRangeUpperLimit = 1;
this.MessageText = "";
this.MessageTextExtensionActive = "";
this.MessageTextExtensionInactive = "";
this.IsActiveLow = false;
}
und zum Schluss die Schnittstellendefinition:
namespace V10Portal.Contracts
{
[ServiceContract]
public interface IOnlineProcessService
{
[OperationContract]
List<ProcessValue> GetValuesByPvs(List<PV> pvs);
[OperationContract]
bool QuittAlarms(List<int> meIDs, int userId, string userName);
[OperationContract]
bool NoticeAlarmConfigChanged();
}
}
Gruß Dominik
Hallo,
du solltest das KnownType-Attribute bei deiner Basisklasse anwenden, nicht bei der abgeleiteten!
mfg
serial