Laden...

WCF Übergabe einer List<T> mit abgeleiteten Objekten

Erstellt von d.gierse vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.452 Views
D
d.gierse Themenstarter:in
115 Beiträge seit 2006
vor 13 Jahren
WCF Übergabe einer List<T> mit abgeleiteten Objekten

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

S
902 Beiträge seit 2007
vor 13 Jahren

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

D
d.gierse Themenstarter:in
115 Beiträge seit 2006
vor 13 Jahren

ja das KnownType-Attribut hatte ich ja bereits gesetzt, ändert aber nix

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

vielleicht kannst du ja mal den entsprechenden quellcode der Basisklasse bzw des Dienstvertrages zeigen.

mfg
serial

D
d.gierse Themenstarter:in
115 Beiträge seit 2006
vor 13 Jahren

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

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

du solltest das KnownType-Attribute bei deiner Basisklasse anwenden, nicht bei der abgeleiteten!

mfg
serial

D
d.gierse Themenstarter:in
115 Beiträge seit 2006
vor 13 Jahren

ja, hab ich dann auch gemerkt 😃
Danke für deine Hilfe!