Witam,
Piszę komunikator TCP/IP i muszę przesyłać obiektu różnego typu, do tego wykorzystuję serializator i zamieniam na tablicę bajtów.
Problem pojawia się w momencie deserializacji. Mogę spodziewać się 5 różnych typów obiektów. W jaki sposób określić jaki to będzie typ w celu deserializacji? Gdy przesyłałem do tej pory tylko jeden typ nie było problemu bo rzutowałem tylko na ten typ, co w przypadku wielu różnych typów?
Dziękuję za odpowiedzi.
Deserializacja obiektów o różnych typach
- Rejestracja: dni
- Ostatnio: dni
- Postów: 21
- Rejestracja: dni
- Ostatnio: dni
- Postów: 47
Nie wiem czy to najlepsze wyjście, ale możesz wrzucić if'y, a w nich sprawdzać tak:
if (zmienna is Twoj_typ)
rzutowanie na Twoj_typ i deserializacja;
- Rejestracja: dni
- Ostatnio: dni
- Postów: 6610
a nie możesz po prostu przed obiektem wysłać jego opis - co to jest i tyle?
- Rejestracja: dni
- Ostatnio: dni
Tak, to jest poprawne rozwiązanie. Ewentualnie możesz stworzyć wspólny interfejs (może być pusty), który będzie implementować każdy obiekt, który będziesz przesyłał i wtedy przy odbiorze powiedzmy 10 obiektów możesz stworzyć listę w takiej postaci List<NazwaInterfejsu> obiekty, a później w razie potrzeby sprawdzać i rzutować na zasadzie :
if(obiekt is JakasKlasa) {
JakasKlasa zrzutowany = obiekt as JakasKlasa;
}
- Rejestracja: dni
- Ostatnio: dni
Możesz też stworzyć klasę opakowująca:
class KlasaOpakowująca {
WspolnyInterfejs obiekt;
Type typObiektu;
}
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Wrocław
niezalogowany napisał(a):
if(obiekt is JakasKlasa) {
JakasKlasa zrzutowany = obiekt as JakasKlasa;
}
Kompletnie bezsensowny kod.
Gdy sprawdziliśmy za pomocą is, że obiekt jest instancja JakasKlasa, to nie ma sensu używać as tylko zwykłego rzutowania. Z drugiej strony, is wewnętrznie wykonuje as, więc nie zawsze ma sens.
- Rejestracja: dni
- Ostatnio: dni
JakasKlasa zrzutowany = obiekt as JakasKlasa;
if (zrzutowany != null)
{
...
}