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