Вчора, коли я проводив тестування синхронізації бази даних, я використовував трохи технологій серіалізації та десеріалізації. Я абстрагцію поля таблиці у клас сутності 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 змінюється, і виявляється, що кожного разу під час виконання операції запису значення вказує на кінець, що пояснює, чому програма повідомляє про таку помилку. Але я не розумію, чому функція десеріалізації (Десеріалізувати) замість того, щоб десеріалізувати весь потік за замовчуванням, починаючи з місця, де знаходиться Позитон?
|