Wczoraj, gdy testowałem synchronizację baz danych, użyłem trochę technologii serializacji i deserializacji. Abstrahuję pola tabeli do klasy encji DiagramInfo, następnie zapisuję nowe rekordy klienta w kolekcji ogólnej, serializuję tę kolekcję i wysyłam do serwera przez TCP, który ją deserializuje i zapisuje te dane do bazy danych. To prawdopodobnie jest proces tej operacji.
Serializacja Używam klasy System.Runtime.Serialization.Iformatter do serializacji zbiorów generycznych na strumienie binarne. Część kodu serializowanego przedstawia się następująco:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Skopiuj kod Następnie wysyłaj za pomocą protokołu TCP, ta część jest pomijana.
Serwer częściowo odbiera dane, zapisuje je jako MemoryStream, a następnie deserializuje – część kodu wygląda następująco:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
Skopiuj kodW tym momencie uruchom klienta i serwera w celu synchronizacji danych, a pojawia się następujący komunikat o błędzie: Zachowanie błędu: diagramy = (Lista)formater. Deserialize(memstream); Dosłownie: spotkałem koniec strumienia zanim konwersja została zakończona. 2. RozwiązaniePo wyszukaniu w Google ktoś odpowiedział na następujące możliwe błędy:1. Rodzaje serializacji i deserializacji są różne, co można tutaj wykluczyć; 2. Nie ma bufora do czyszczenia strumienia podczas serializacji, a metoda Flush() nie jest używana, którą również można tu wykluczyć. 3. Rozmiar bufora procesu odbioru przed deserializacją może nie być wystarczający, uważam, że nie powinno być z tym problemu, deserializacja odbywa się po strumieniu akwizycji, nie powinna mieć nic wspólnego z rozmiarem bufora, moja osobista opinia, nie próbowałem; 4. Dodaj przed deserializacjąStrem. Pozycja=0。 (Strumień to strumień do deserializacji, faktycznie strumień memów) Po testach czwarta może zadziałać w moim programie. Dlaczego więc tak się dzieje, po jednym kroku debugowania obserwuj strumień memów? Wartość Postiona się zmienia i okazuje się, że za każdym razem, gdy wykonuje się operację zapisu, wartość wskazuje na koniec, co tłumaczy, dlaczego program zgłasza taki błąd. Ale nie rozumiem, dlaczego funkcja deserializacji (Deserializować) zamiast domyślnie deserializować cały strumień od miejsca, gdzie jest pozycja?
|