Вчера, докато правех тестване за синхронизация на бази данни, използвах малко технология за сериализация и десериализация. Абстрахирам полетата на таблицата в клас на ентитети DiagramInfo, след това съхранявам новите записи на клиента в обща колекция, след което сериализирам тази генерична колекция и я изпращам на сървъра чрез TCP, който я десериализира, и след това записва тези данни в базата данни. Това вероятно е процесът на тази операция.
Сериализация Използвам класа System.Runtime.Serialization.Iformatter за сериализиране на генерични колекции в двоични потоци. Някои от сериализираните кодове са следните:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Копирай код След това изпрати чрез TCP протокола, тази част е пропусната.
Сървърът частично получава данните, запазва ги като MemoryStream и след това ги десериализира, като част от кода е следната:
- 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();
Копирай кодВ този момент стартирайте клиента и сървъра, за да синхронизирате данните, и се появява следното съобщение за грешка: Поведение при грешка: диаграми = (Списък)форматор. Deserialize (memstream); Буквално: срещнах края на потока преди конверсията да е завършена. 2. РешениеСлед търсене в Google, някой отговори на следните възможни грешки:1. Видовете сериализация и десериализация са различни, което може да бъде изключено тук; 2. Няма буфер за изчистване на потока по време на сериализация, а методът Flush() не се използва, което също може да бъде изключено тук. 3. Размерът на буфера в процеса на получаване преди десериализацията може да не е достатъчен, мисля, че не би трябвало да има проблем с това, десериализацията се извършва след потока на придобиване, не би трябвало да има нищо общо с размера на буфера, лично мнение, не съм го пробвал; 4. Добавяне преди десериализацияСтрем. Позиция=0。 (Потокът е потокът, който трябва да се десериализира, всъщност memstream) След тестовете, четвъртият може да е подходящ за моята програма. Тогава защо се случва това? След една стъпка на дебъгване наблюдавайте memstream? Стойността на Postion се променя и се установява, че всеки път, когато се изпълнява операция за запис, стойността сочи към края, което обяснява защо програмата докладва такава грешка. Но това, което не разбирам, е защо функцията за десериализация (Deserialize) вместо да десериализира целия поток по подразбиране, започвайки от мястото, където е Позитонът?
|