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

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

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

Привожу код сериализации и отправки объекта:
public void SendRezult(object rezult)
        {
 
            using (MemoryStream reader =new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(reader, rezult);
 
                long send = 0L, length = reader.Length;
                _client.Send(BitConverter.GetBytes(length));
 
                byte[] buffer = new byte[BufferSize];
                int read, sent;
                reader.Position = 0;
                while ((read = reader.Read(buffer, 0, BufferSize)) != 0)
                {
                    sent = 0;
                    while ((sent += _client.Send(buffer, sent, read, SocketFlags.None)) < read)
                    {
                        send += (long)sent;
                        //Console.WriteLine (" Sent + send + " " /" + length + "."); / / progress
                    }
                }
 
            }

        }
И приема с дессериализацией:
  public object ReceiveAnswer() 
        {

            byte[] receivedBuffer = null;
 
            byte[] buffer = new byte[BufferSize];
            _client.Receive(buffer);
              long receive = 0L, length = BitConverter.ToInt64 (buffer, 0);

                int received;
              
                while (receive < length)
                {
                    received = _client.Receive (buffer);
                    receivedBuffer = ConcatenateArrays(receivedBuffer, buffer);
                    receive += (long) received;
               }
                MemoryStream ms = new MemoryStream(receivedBuffer);
                ms.Position = 0;
                return (object)new BinaryFormatter().Deserialize(ms);

        }
 
//Ниже привожу код с помощью которого конкатинирую масссивы, хотя
 //врятли сдесь трабла
byte[] ConcatenateArrays(byte[] Arr1, byte[] Arr2) 
        {
            if (Arr1 == null&&Arr2!=null) return Arr2;
            else
                if (Arr2 == null) return Arr1;
                else
                {
                    byte[] Rezult = new byte[Arr1.Length + Arr2.Length];
 
                    Arr1.CopyTo(Rezult, 0);
                    Arr2.CopyTo(Rezult, Arr1.Length);
                    return Rezult;
                }

        }
ошибка постоянно появляется на последней строчке ( на строчке return-a) Код ошибки: Двоичный поток "170" не содержит допустимого двоичного заголовка BinaryHeader. Возможные причины: недопустимый поток или изменение версии объекта между сериализацией и десериализацией. При чем при нажатии continue в дебаг меню, цифра 175 меняется на 165, 165 на 124, а после еще одного continue такая ошибка вылазит: Недопустимый двоичный формат входного потока. Начало содержимого (в байтах): 94-AA-7A-9F-22-62-B5-71-E3-46-72-F6-60-3B-B9-78-6E ...

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

textual
Листинг программы
public T ReceiveAnswer<T>()
        {
            var buffer = new byte[BufferSize];
            _client.Receive(buffer);
            long receive = 0L, length = BitConverter.ToInt64(buffer, 0);
 
            byte[] receivedBuffer = new byte[length];
            using (var mrs = new MemoryStream(receivedBuffer))
            {
                while (receive < length)
                {
                    int received = _client.Receive(buffer);
                    mrs.Write(buffer, 0, received);
                    receive += received;
                }
                mrs.Seek(0, SeekOrigin.Begin);
                return (T)new BinaryFormatter().Deserialize(mrs);
            }
        }

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


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

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

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