.NET 4.x Ошибка сериализации/десериализации - C#
Формулировка задачи:
Доброго времени суток.
Пишу программу для передачи информации о компьютере по сети.
Имеются 2 приложения (сейчас обы Windows Form, в последствии сервер будет переделан в службу Windows для удобства) и 2 библиотеки (одна реализует базовые классы и перечесления для обоих программ, другая реализует команды для серверной части)
Поскольку системные классы практически все помечены как не сериализуемые (да и все параметры мне не нужны) я сделал 9 классов своих типов данных (Классы 1 библиотеки ais.dll):На клиенте и на сервер постоянно на прием работает поток вот с этой процедурой, различен только параметр Data (на клиенте ServerPack, на сервере ClientPack, в остальном одинаково и на сервере и на клиенте (порты приема и передачи - различны, но реверсивно установлены на клиенте и сервере):
При запуске программы, все хорошо работает, но вот иногда влазит вот такая ошибка:
Обычно после попытки остановки службы на удаленном ПК, служба останавливается, а вот ответ приходит вот такой вот.
Сборки, версии библиотек одинаковы.
В чём может быть причина?
- ClientPack - класс, хранящий пакет отправляемый с сервера клиенту
- ServerPack - класс, хранящий пакет отправляемый с клиента серверу
- Counters - статический класс, реализует работу с системными счётчиками (реализуется, только на сервере)
- Settings - класс, хранящий настройки как сервера, так и клиента
- Software - класс, хранящий информацию о установленном программном продукте (передается массив, как список установленного ПО)
- StartInfo - класс, формирующий параметры для запуска процесса на сервер (передается с клиента на сервер)
- SystemProcess - класс, хранящий информацию о системном процессе
- SystemService - класс, хранящий информацию о службе Windows
- ValueCounters - класс, хранящий значения системных счётчиков реализуемых классом Counters
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 { }
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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д