Ten artykuł jest lustrzanym artykułem tłumaczenia maszynowego, kliknij tutaj, aby przejść do oryginalnego artykułu.

Widok: 18725|Odpowiedź: 0

[Źródło] Jedno pytanie dotyczące serializacji i deserializacji

[Skopiuj link]
Opublikowano 27.10.2015 19:07:26 | | | |
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:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
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:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
Skopiuj kod
W 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?





Poprzedni:String[3]: własność Size ma nieprawidłowy rozmiar 0.
Następny:vs2010 serwer połączenia vss2005 błąd czasowy, problem jest taki, jak pokazano na rysunku, poproś boga o pomoc
Zrzeczenie się:
Całe oprogramowanie, materiały programistyczne lub artykuły publikowane przez Code Farmer Network służą wyłącznie celom edukacyjnym i badawczym; Powyższe treści nie mogą być wykorzystywane do celów komercyjnych ani nielegalnych, w przeciwnym razie użytkownicy ponoszą wszelkie konsekwencje. Informacje na tej stronie pochodzą z Internetu, a spory dotyczące praw autorskich nie mają z nią nic wspólnego. Musisz całkowicie usunąć powyższą zawartość z komputera w ciągu 24 godzin od pobrania. Jeśli spodoba Ci się program, wspieraj oryginalne oprogramowanie, kup rejestrację i korzystaj z lepszych, autentycznych usług. W przypadku naruszenia praw prosimy o kontakt mailowy.

Mail To:help@itsvse.com