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