• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

deserializacja BinaryFormatter jakiego typu jest obiekt

Object Storage Arubacloud
0 głosów
111 wizyt
pytanie zadane 24 lipca 2017 w C# przez jankustosz1 Nałogowiec (35,880 p.)

Witam.

Używam BinaryFormatter do serializacji i deserializacji pakietów. Najpierw przesyłam string nazwę klasy pakietu, a potem zaserializowany pakiet w bajtach. Problem jest taki że przy deserializacji zwracany jest typ object i nie wiem jak zrobić aby stał się typem danego pakietu, może pokażę na przykładzie w czym problem. Pakiet to klasa bazowa abstrakcyjna.

        public void Receive(Gniazdo gniazdo)
        {
            string rodzajString = gniazdo.Reader.ReadString(); // to mi zwraca nazwę klasy pakietu może być do np. FilePacket, albo InfoPacket
            Type typPakietu = Assembly.GetAssembly(typeof(Pakiet)).GetType(rodzajString); // pobieram typ pakietu
            Pakiet pakiet = Deserialize(gniazdo.Reader.BaseStream) as Pakiet; // pobieram bajty i je deserializuje
            // chciałbym teraz zrobić aby zmienna pakiet wewnętrznie zmieniła swój typ na typPakietu aby następująca instrukcja zwróciła true
            bool czyDziala = pakiet is FilePacket; //  przy zalozeniu typPakietu to np. FilePacket chciałbym aby cos zrobić aby ta instrukcja zwrocila true 
       }
        private static object Deserialize(Stream stream)
        {
            BinaryFormatter bt = new BinaryFormatter();
            return bt.Deserialize(stream);
        }

   // kawalek klasy gniazdo
    public abstract class Gniazdo : IDisposable
    {
        public object LockWriter { get; set; }
        public BinaryWriter Writer { get; set; }
        public BinaryReader Reader { get; set; }
        public TcpClient Client { get; set; }
    }

 

Coś takiego np. zwróci true bo gdzieś wewnętrznie jest przechowywana informacja że adres na który wskazuje obj jest intem. Da się jakoś do tej informacji dobrać i ją zmienić?

int a = 2;
object obj = a;
bool czyDziala = obj is int;

 

2 odpowiedzi

0 głosów
odpowiedź 29 lipca 2017 przez jankustosz1 Nałogowiec (35,880 p.)
 
Najlepsza
Poczytałem trochę w internecie i zrezygnowałem z serializowania za pomocą binaryformatter. Są tam przesyłane także dodatkowe niepotrzebne dane o klasie, czego nie da się wyłączyć i jak są 2 różne programy to pojawiają się errory.

Dodałem do Packet dwie abstrakcyjne metody Serialize i Deserialize które przyjmują BinaryWriter i BinaryReader i po prostu z nich korzystam.
0 głosów
odpowiedź 27 lipca 2017 przez piotrsz109 Stary wyjadacz (13,730 p.)

BinaryWriter i Reader zmień na StreamReader i StreamWriter (System.IO)

Zmień serializację na Json (Newtownsoft.Json). Tam możesz deserializować string'a generycznie:

FilePacket packet = JsonConvert.DeserializeObject<FilePacket>(gniazdo.Reader.ReadLine());

 

Podobne pytania

0 głosów
0 odpowiedzi 135 wizyt
pytanie zadane 30 stycznia 2018 w C# przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
0 głosów
1 odpowiedź 625 wizyt
pytanie zadane 8 maja 2017 w Algorytmy przez Kapi2222 Obywatel (1,220 p.)
0 głosów
1 odpowiedź 267 wizyt
pytanie zadane 8 kwietnia 2020 w C# przez Sic Dyskutant (8,510 p.)

92,568 zapytań

141,422 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...