Laden...

WCF: Problem mit Serialisierung eines object[]-Arrays

Erstellt von DonC vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.939 Views
D
DonC Themenstarter:in
30 Beiträge seit 2007
vor 13 Jahren
WCF: Problem mit Serialisierung eines object[]-Arrays

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

3.728 Beiträge seit 2005
vor 13 Jahren
Positionen über callbacks?

Hallo DonC,

was für eine Art von Anwendung schreibst Du denn?
Warum möchtest Du eine Positionen über einen callback zurück zum Client senden?

Ich frage das, da Callbacks einige Nachteile mit sich bringen. Es gibt Leute, die bi-direktionale Kommunikation verwenden, obwohl sie das für ihre Problemstellung gar nicht bräuchten.

Ich brauche mehr Informationen über Deine Anwendung, damit ich Dir helfen kann.

Wofür ist überhaupt die GeneralSystemMessage? Klingt nach Eierlegenderwollmilchsau.

D
DonC Themenstarter:in
30 Beiträge seit 2007
vor 13 Jahren

Hi,

ich schreibe eine Client-Server-Anwendung, wobei der Client Nachrichten zum Server schickt und umgekehrt. D.h. der Client schickt eine Nachricht zum Server, dieser wertet die Nachricht aus und schickt bei Bedarf das Ergebnis zum Client zurück. Die Funktion "OnGeneralSystemMessage" ist dafür da, allgemeine Systemmeldungen auszugeben 😉 Um auf einfach Wege eine spätere Mehrsprachigkeit umsetzen zu könne, wird der Methode als erster Parameter ein Message-Code übergeben. Über diesen Message-Code rufen Client als auch Server eine Funktion "getMessageForCode(int message_id, object[] objects)" auf, welche wiederum die zum Message-Code gehörende Meldung als String zurückgibt. Und hier kommt auch der "objects"-Parameter zur Anwendung. Dieser enthält beliebige Objekt (in den meisten Fällen Strings) um die zum Message-Code dazuugehörigen Meldungen sinnvoll mit Werten zu ersetzen. Beispiel:



string getMessageForCode(int message_id, object[] objects)
{
      switch (message_id)
{
     case 1:
          return "Das ist eine Testmeldung. Hier wurde der Wert " + objects[0].ToString() + " übergeben.";

   ...

}

}


Oftmals kommt es vor, dass für bestimmte Meldungen sehr viele Strings im object-Array übergeben werden müssten. Um die Lesbarkeit des Codes zu verbessern, übergebe ich als Alternative im object-Array das komplette Objekt, welches die für die Meldungen notwendigen Angaben enthält. So lassen sich später auch weitere Angaben des Position-Objekts leicht in der Meldung ausgeben. Beispiel:



case 1:

     Position position = (Position)objects[0];

     return "Hier haben wir die Position mit ID " + position.PositionID + " usw.";


Ich hoffe, so ist es etwas verständlicher 😃

Greetz,
Chris

656 Beiträge seit 2008
vor 13 Jahren

Wenn die Typen bekannt sind, die du dort übergeben und verarbeiten kannst (was ich mal annehme, weil du ja auch deine "getMessageForCode" kennst), könntest du das KnownTypeAttribute versuchen.

D
DonC Themenstarter:in
30 Beiträge seit 2007
vor 13 Jahren

Hi Bhaal.

das war's tatsächlich. Damit funzt es. Besten Dank 😃

Greetz,
Chris