Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 18725|Отговор: 0

[Източник] Един въпрос относно сериализацията и десериализацията

[Копирай линк]
Публикувано в 27.10.2015 г. 19:07:26 ч. | | | |
Вчера, докато правех тестване за синхронизация на бази данни, използвах малко технология за сериализация и десериализация. Абстрахирам полетата на таблицата в клас на ентитети DiagramInfo, след това съхранявам новите записи на клиента в обща колекция, след което сериализирам тази генерична колекция и я изпращам на сървъра чрез TCP, който я десериализира, и след това записва тези данни в базата данни. Това вероятно е процесът на тази операция.

       Сериализация Използвам класа System.Runtime.Serialization.Iformatter за сериализиране на генерични колекции в двоични потоци. Някои от сериализираните кодове са следните:

  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.         }
Копирай код
След това изпрати чрез TCP протокола, тази част е пропусната.

Сървърът частично получава данните, запазва ги като MemoryStream и след това ги десериализира, като част от кода е следната:
  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();
Копирай код
В този момент стартирайте клиента и сървъра, за да синхронизирате данните, и се появява следното съобщение за грешка:
Поведение при грешка: диаграми = (Списък)форматор. Deserialize (memstream);
Буквално: срещнах края на потока преди конверсията да е завършена.
2. РешениеСлед търсене в Google, някой отговори на следните възможни грешки:
1. Видовете сериализация и десериализация са различни, което може да бъде изключено тук;
2. Няма буфер за изчистване на потока по време на сериализация, а методът Flush() не се използва, което също може да бъде изключено тук.
3. Размерът на буфера в процеса на получаване преди десериализацията може да не е достатъчен, мисля, че не би трябвало да има проблем с това, десериализацията се извършва след потока на придобиване, не би трябвало да има нищо общо с размера на буфера, лично мнение, не съм го пробвал;
4. Добавяне преди десериализацияСтрем. Позиция=0。 (Потокът е потокът, който трябва да се десериализира, всъщност memstream)
След тестовете, четвъртият може да е подходящ за моята програма. Тогава защо се случва това? След една стъпка на дебъгване наблюдавайте memstream? Стойността на Postion се променя и се установява, че всеки път, когато се изпълнява операция за запис, стойността сочи към края, което обяснява защо програмата докладва такава грешка. Но това, което не разбирам, е защо функцията за десериализация (Deserialize) вместо да десериализира целия поток по подразбиране, започвайки от мястото, където е Позитонът?





Предишен:Низ[3]: свойството Size има невалиден размер 0.
Следващ:vs2010 Connection Server vss2005 Грешка във времето, проблемът е, както е показано на фигурата, поискайте помощта на Бога
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com