• 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

VPS Starter Arubacloud
0 głosów
108 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 133 wizyt
pytanie zadane 30 stycznia 2018 w C# przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
0 głosów
1 odpowiedź 621 wizyt
pytanie zadane 8 maja 2017 w Algorytmy przez Kapi2222 Obywatel (1,220 p.)
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 8 kwietnia 2020 w C# przez Sic Dyskutant (8,510 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...