Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 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) вместо того, чтобы по умолчанию десериализировать весь поток, начиная с того места, где находится Positon?





Предыдущий:Строка[3]: свойство Size имеет недопустимый размер 0.
Следующий:Ошибка времени сервера vs2010 vss2005, проблема в том, как показано на рисунке, попросите помощи у Бога
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com