WCF: Problem mit Serialisierung



  • Hallo allerseits,

    ich bin gerade dabei, eine Client-Server-Anwendung mit WCF zu erstellen. Das ganze läuft auch schon relativ gut, allerdings bin ich nun auf folgendes Problem gestoßen:

    Ich habe im Callback-Contract des Clients folgende Methode implementiert:

    [OperationContract(IsOneWay = true)]
    void OnGeneralSystemMessage(int message_code, object[] objects);

    Wenn meine Server-Anwendung nun obige Methode mit

    OnGeneralSystemMessage("Das ist eine Testmeldung.", new object[] { "Teststring" });

    aufruft, klappt das alles wunderbar. Alles kommt beim Client an und dieser kann auch ohne Probleme auf den String im object[]-Array zugreifen. Soweit so gut ...

    Nun habe ich in meiner Anwendung jedoch eine Klasse "Position". Diese habe ich mit dem [Serializable]-Attribut auch als Serialisierbar gekennzeichnet. Das ganze scheint prinzipiell auch zu funktionieren, denn ich habe in meinem Callback-Contract auch noch eine Methode "addPosition(Position position)" welche als Parameter wie man sieht eben ein Objekt des Typs "Position" erwartet. Die Übergabe des Position-Objekts klappt über diese Methode auch zwischen Server und Client reibungslos. Nun aber endlich zu meinem eigentlichen Problem:

    Wenn ich die "OnGeneralSystemMessage"-Methode mit einem Position-Objekt im object[]-Array aufrufe, kommt nix mehr an. Meine Anwendung meldet einfach einen Receive-Timeout. Hier ein Beispielaufruf:

    Position position = new Position();
    client.OnGeneralSystemMessage("Das ist noch ein Test.", new object[] { position });

    Das funktioniert nicht. Wie kann es sein, dass ich über die Methode "addPosition(Position position)" ein Position-Objekt vom Server zum Client schicken kann, aber nicht über die Methode
    "OnGeneralSystemMessage"? Ich denke ja, dass es irgendwas mit der fehlenden Typsicherheit des object[]-Arrays zu tun hat, aber wie kann man das Problem in meinem konkreten Fall lösen?

    Greetz,
    Chris



  • Vererbung (in diesem Fall object => Position) wird nicht von den Übertragungsdiensten oder evtl sogar vom Client unterstützt, so dass diese zusätzlichen Attribute der Positionsobjekte extra übergeben werden müssen. Du mußt diese spezialisierten Typen mit angeben:

    [ServiceContract]
    [ServiceKnownType(typeOf(Position ))]
    public interface IMyService
    {
        [OperationContract(IsOneWay = true)]
        void OnGeneralSystemMessage(int message_code, object[] objects); 
    }
    

    Da scheint aber noch ein Problem da zu sein. Naja, versuch's erst einmal.



  • Hi Witte,

    das war's tatsächlich. Ich habe beim Client- als auch beim Server-Contract das ServiceKnownType-Attribut gesetzt und jetzt funzt es. Besten Dank nochmal 🙂

    Greetz,
    Chris


Anmelden zum Antworten