.NET 4.x Ошибка сериализации/десериализации - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. Пишу программу для передачи информации о компьютере по сети. Имеются 2 приложения (сейчас обы Windows Form, в последствии сервер будет переделан в службу Windows для удобства) и 2 библиотеки (одна реализует базовые классы и перечесления для обоих программ, другая реализует команды для серверной части) Поскольку системные классы практически все помечены как не сериализуемые (да и все параметры мне не нужны) я сделал 9 классов своих типов данных (Классы 1 библиотеки ais.dll):
  1. ClientPack - класс, хранящий пакет отправляемый с сервера клиенту
  2. ServerPack - класс, хранящий пакет отправляемый с клиента серверу
  3. Counters - статический класс, реализует работу с системными счётчиками (реализуется, только на сервере)
  4. Settings - класс, хранящий настройки как сервера, так и клиента
  5. Software - класс, хранящий информацию о установленном программном продукте (передается массив, как список установленного ПО)
  6. StartInfo - класс, формирующий параметры для запуска процесса на сервер (передается с клиента на сервер)
  7. SystemProcess - класс, хранящий информацию о системном процессе
  8. SystemService - класс, хранящий информацию о службе Windows
  9. ValueCounters - класс, хранящий значения системных счётчиков реализуемых классом Counters
Во второй библиотеке имеется только 1 статический класс cmd и множество процедур и функции. Одна из них реализует отправку объектов с сервера клиенту:
public static void Transmition(ServerPack Param, byte[] ipRemoutePC, int port)
        {
            try
            {
                Socket SendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                SendSocket.Connect(new IPAddress(ipRemoutePC), port);
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, Param);
                byte[] ab = ms.ToArray();
                SendSocket.Send(ms.ToArray());
                SendSocket.Close();
            }
            catch
            { 
            }
На клиенте и на сервер постоянно на прием работает поток вот с этой процедурой, различен только параметр Data (на клиенте ServerPack, на сервере ClientPack, в остальном одинаково и на сервере и на клиенте (порты приема и передачи - различны, но реверсивно установлены на клиенте и сервере):
private static void StartReceive(ref Socket NetSocket, ref ServerPack Data)
        {
            try
            {
                while (flag)
                {
                    Socket handler = NetSocket.Accept();
                    byte[] ReceiveData = new byte[1048576];
                    handler.Receive(ReceiveData);
                    MemoryStream ms = new MemoryStream(ReceiveData);
                    BinaryFormatter bf = new BinaryFormatter();
                    Data = (ServerPack)bf.Deserialize(ms);
                }
            }
            catch (Exception e)
            {
                Data = new ServerPack();
                Data.SendObject = e.Message;
            }
        }
При запуске программы, все хорошо работает, но вот иногда влазит вот такая ошибка:
Полученные данные не опознаны. Двоичный поток "0" не содержит допустимого двоичного заголовка BinaryHeader. Возможные причины: недопустимый поток или изменение версии объекта между сериализацией и десериализацией.
Обычно после попытки остановки службы на удаленном ПК, служба останавливается, а вот ответ приходит вот такой вот. Сборки, версии библиотек одинаковы. В чём может быть причина?

Решение задачи: «.NET 4.x Ошибка сериализации/десериализации»

textual
Листинг программы
handler.Receive(ReceiveData);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.571 из 5
Похожие ответы