WCF - übergabe einer Klasse(List)

  • C#
  • .NET (FX) 4.5–4.8

    WCF - übergabe einer Klasse(List)

    //Edit: Fehler gefunden. In der Klasse "cBuildings" muss folgendes Atribut hinzugefügt werden:

    C#-Quellcode

    1. [KnownType(typeof(BigHaus))]


    und vor den entsprechenden membern muss "[DataMember(IsRequired = true)]" vorstehen


    Hallo,

    ich habe mich nun mal an das Thema "WCF" gewagt (Windows Communication Foundation) //Info: Bislang nur die Basics input.
    Soweit funktioniert alles, übergabe Parameter klappen, Rückgabewerte usw.
    Nun habe ich aber folgende Problemstellung:

    Auf dem Client habe ich eine lokale Variable von der Klasse Gebäude (Storage.Building)
    diese ist als List<CBuildings> aufgebaut.
    Will ich diese vom Server abrufen, funktioniert es soweit (diese wird auf der SERVER SEITE Initialisiert, und
    auf dem Client dann entsprechend zugewiesen) - funktioniert.

    Wenn ich nun auf dem Client, in der Liste, ein Gebäude hinzufügen will(ist eine Unterklasse von CBuildings),
    funktioniert auch alles soweit. Wenn ich diese jedoch an den Server senden möchte, erhalte ich folgende Fehlermeldung:

    Fehler beim Deserialisieren von Parameter tempuri.org/:Buildings. Die InnerException-Nachricht war "Der Typ 'Server.BigHaus' mit dem Datenvertragsnamen 'BigHaus:schemas.datacontract.org/2004/07/Server' wird nicht erwartet.....


    Server:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.ServiceModel;
    7. namespace Server
    8. {
    9. [ServiceContract]
    10. public interface Interface
    11. {
    12. [OperationContract]
    13. string setBuildings( List<CBuildings> Buildings );
    14. }
    15. }
    16. //Library
    17. using System;
    18. using System.Collections.Generic;
    19. using System.Linq;
    20. using System.Text;
    21. using System.Threading.Tasks;
    22. namespace Server
    23. {
    24. class Library:Interface
    25. {
    26. public string setBuildings( List<CBuildings> Buildings )
    27. if (cStorage.Buildings == null)
    28. cStorage.Buildings = new List<CBuildings>();
    29. cStorage.Buildings = Buildings ;
    30. return "OK"; // only for debug
    31. }
    32. public List<CBuildings> getBuildings()
    33. {
    34. if (cStorage.Buildings == null)
    35. cStorage.Buildings = new List<CBuildings>();
    36. return cStorage.Buildings;
    37. }
    38. }
    39. }
    40. //cStorage
    41. using System;
    42. using System.Collections.Generic;
    43. using System.Linq;
    44. using System.Text;
    45. using System.Threading.Tasks;
    46. namespace Server
    47. {
    48. public static class cStorage
    49. {
    50. // diese wird beim "Anmelden des Clients" als new deklariert
    51. public static List<CBuildings> Buildings;
    52. }
    53. }


    Die klasse ist als " [Serializable()]" entsprechend gekennzeichnet.

    Client:

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace tmp
    7. {
    8. [Serializable()]
    9. public static class Storage
    10. {
    11. public static List<Server.CBuildings> Gebauede { get; set; }
    12. }
    13. }
    14. // im Hauptformular:
    15. private void frmMain_Load( object sender, EventArgs e )
    16. {
    17. Storage.Gebauede = Settings.host.getBuildings();
    18. }


    Für mich stellt sich die Frage, warum es hier nicht funktioniert, aber bei anderen Klassen schon(einziger Unterschied ist,
    dass ich dort keine List<> übergebe)

    Hat jemand eine Idee ode rein Tipp, wie ich das Problem lösen könnte ?

    Gruß

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Annoxoli“ ()