Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

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





Попередній:Рядок[3]: властивість Size має недопустимий розмір 0.
Наступний:VS2010 Connection Server vss2005 Time Error, проблема, як показано на рисунку, попросіть допомоги у Бога
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com