Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2012, 11:52   #1
6salo6
Новичок
Джуниор
 
Регистрация: 06.02.2012
Сообщений: 3
По умолчанию Исключение при дессериализации "обнаружен конец потока до завершения разбора"

Здравствуйте, уважаемые,подскажите пожалуйста из-за чего выскакивает исклюение "обнаружен конец потока до завершения разбора" в строке дессериализации.
Код:
 public Object Receive(Int64 buf)
        {
            BinaryFormatter bFormat = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream();
            byte[] biteDeserialize = new byte[buf];
            int i = _Client.Receive(biteDeserialize);
            mStream.Write(biteDeserialize, 0, i);
            mStream.Position = 0;
            // Десериализуем объект.
            Object PasDat = (Object)bFormat.Deserialize(mStream);
            mStream.Close();
            _Client.Send(new byte[1]);  //информируем отправителя о получении сообщения
            return PasDat;
        }
Очень прошу помочь, никак не могу разобраться.
6salo6 вне форума Ответить с цитированием
Старый 06.02.2012, 18:45   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну собственно причина сказана в ошибке.
получили меньше байт чем нужно для десериализации.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.02.2012, 19:37   #3
6salo6
Новичок
Джуниор
 
Регистрация: 06.02.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну собственно причина сказана в ошибке.
получили меньше байт чем нужно для десериализации.
Дело в том, что в отладчике когда смотрю на позицию в потоке после обнуления, она так и не изменилась. И это исключение не всегда выскакивает. Может из-за этого? Посмотрите пожалуйста весь код.
6salo6 вне форума Ответить с цитированием
Старый 06.02.2012, 19:38   #4
6salo6
Новичок
Джуниор
 
Регистрация: 06.02.2012
Сообщений: 3
По умолчанию

Код:
class ClientSocket
    {
        /// <summary>
        /// Ссылка на клиент
        /// </summary>
        Socket _Client;
        /// <summary>
        /// Клиент. Только для чтения
        /// </summary>
        public Socket Client
        {
            get { return _Client; }
        }
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Client">Клиент с которым будем работать</param>
        public ClientSocket(Socket Client)
        {
            _Client = Client;
        }
        /// <summary>
        /// Приём данных с подтверждением и десереализация в Object
        /// </summary>
        /// <param name="buf">Размер ожидаемых данных</param>
        /// <returns>Полученный объект</returns>
        public Object Receive(Int64 buf)
        {
            BinaryFormatter bFormat = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream();
            byte[] biteDeserialize = new byte[buf];
            int i = _Client.Receive(biteDeserialize);
            mStream.Write(biteDeserialize, 0, i);
            mStream.Position = 0;
            // Десериализуем объект.
            Object PasDat = (Object)bFormat.Deserialize(mStream);
            mStream.Close();
            _Client.Send(new byte[1]);  //информируем отправителя о получении сообщения
            return PasDat;
        }
        /// <summary>
        /// Сериализация объекта
        /// </summary>
        /// <param name="PasDat">Сериализуемый объект</param>
        /// <param name="biteSerialize">Байтовый массив в который преобразуется объект</param>
        /// <returns>Длина потока в байтах</returns>
        public long Serializ(Object PasDat, out byte[] biteSerialize)
        {
            BinaryFormatter bFormat = new BinaryFormatter();
            MemoryStream mStream = new MemoryStream();

            // Сериализуем объект.
            bFormat.Serialize(mStream, PasDat);

            // Сохраняем в массив.
            long len = mStream.Length;
            biteSerialize = new byte[len];
            mStream.Position = 0;
            int i = mStream.Read(biteSerialize, 0, (int)mStream.Length);
            mStream.Close();
            return len;
        }
        /// <summary>
        /// Отправка данных с ожиданием подтверждения о получении сообщения
        /// </summary>
        /// <param name="biteSerialize">Байтовый массив</param>
        public void Send(byte[] biteSerialize)
        {
            _Client.Send(biteSerialize);    // Передаем массив.
            _Client.Receive(new byte[1]);   // Ждём подтверждения
        }
        /// <summary>
        /// Отправка любого объекта
        /// </summary>
        /// <param name="PasDat">Отправляемый объект</param>
        public void SendObj(Object PasDat)
        {
            byte[] biteSerInfo, biteSerObject;
            Int64 SizeData = Serializ(PasDat, out biteSerObject);
            Serializ(SizeData, out biteSerInfo);  //сериализуем информацию
            Send(biteSerInfo);  //отправляем информацию
            Send(biteSerObject);    //отправляем сам объект
        }
        /// <summary>
        /// Приём объекта
        /// </summary>
        /// <returns>Полученный оъект</returns>
        public Object ReceiveObj()
        {
            //получаем информацию о ожидаемом объекте
            Int64 SizeData = (Int64)Receive(1024);
            //получаем объект
            Object Obj = (Object)Receive(SizeData);
            return Obj;
        }
    }


    /// <summary>
    /// Класс для передачи по сети входных данных
    /// </summary>
    [Serializable]
    public class InputData
    {
        /// <summary>
        /// Размерность матрицы
        /// </summary>
        public Int32 _Size;
        /// <summary>
        /// Начальный элемент диапазона в матрице который нужно вычислить
        /// </summary>
        public Int32 _beginEl;
        /// <summary>
        /// Конечный элемент диапазона в матрице который нужно вычислить
        /// </summary>
        public Int32 _endEl;
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="Size">Размерность матрицы</param>
        /// <param name="beginEl">Начальный элемент диапазона в матрице который нужно вычислить</param>
        /// <param name="endEl">Конечный элемент диапазона в матрице который нужно вычислить</param>
        public InputData(Int32 Size, Int32 beginEl, Int32 endEl)
        {
            _Size = Size;
            _beginEl = beginEl;
            _endEl = endEl;
        }
    }
6salo6 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: Необработанное исключение типа "System.IO.FileNotFoundExceptio n" MoT9I Visual C++ 1 27.11.2011 12:31
значения "на конец месяца" перенести на "начало месяца" 0mega Microsoft Office Excel 2 10.05.2010 07:23
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
настроить при открытии Excel 2003 в окошке "Тип файлов" вывод пункта "Все файлы (*.*)" по умолчанию? Unior Microsoft Office Excel 2 01.03.2009 02:42