.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);