Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XML сериализация в сетевой поток 
:(
    Опции темы
mrblack2
Дата 18.6.2009, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Есть непонятная проблема с десериализацией из сетевого потока. На клиентской стороне происходит сериализация класса с данными в сетевой поток. На стороне сервера при подключении клиента открывается поток чтения данных с клиента:
Код

private void DoClient()
        {
            string clientadr;
            TcpClient client = tcpListener.AcceptTcpClient();
            clientadr = client.Client.RemoteEndPoint.ToString();
            Packet d = new Packet();
            XmlSerializer serializer = new XmlSerializer(typeof(Packet));
            //NetworkStream clientstrm = client.GetStream();
            while (!StopThread)
            {
                Thread.Sleep(10);
                if (client.Available > 0)
                {
                    NetworkStream clientstrm = client.GetStream();
                    d = (Packet)serializer.Deserialize(clientstrm);
                    SaveXMLObj(d, clientadr);
                }
            }

На строке десериализации программа останавливается. Если следом приходит следующий пакет возникает эксепшен (ошибка в XML). Нормально продолжается только в случае закрытия соединения клиентом, что недопустимо т.к. предпологается двухсторонний обмен данными с клиентом в течении продолжительного времени. Вариант когда из потока чтение делается в массив байт с последующим его преобразованием в поток памяти (memory stream) и десериализацией работает нормально.

Что с сетевым потоком не так?
     
PM MAIL   Вверх
Bogdan1024
Дата 18.6.2009, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1436
Регистрация: 28.9.2005
Где: Киев

Репутация: 5
Всего: 13



Может при отправке не делается Flush и поэтому всё посылается разу только когда поток закрывается?


--------------------
user posted image
PM MAIL   Вверх
Enteropoly
Дата 18.6.2009, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 17.6.2009

Репутация: нет
Всего: нет



Вообще, предлагаю тебе разбить это дело на два этапа, т.е. остановиться на "Варианте когда из потока чтение делается в массив байт с последующим его преобразованием в поток памяти (memory stream) и десериализацией." Возможно, потому, что десериалайзеру требуется полный, готовый объект, и влёт он проворачивать подобные операции неспособен.

А ещё можно попробовать вместо XML использовать бинарный сериалайзер (если это не критично).
PM MAIL   Вверх
mrblack2
Дата 18.6.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 18.6.2009

Репутация: нет
Всего: нет



Цитата(Enteropoly @ 18.6.2009,  13:47)
... Возможно, потому, что десериалайзеру требуется полный, готовый объект, и влёт он проворачивать подобные операции неспособен.
А ещё можно попробовать вместо XML использовать бинарный сериалайзер (если это не критично).

Так в сетевом потоке и лежит полный объект. Ведь когда я читаю методом Read синхронным никаких задержек не происходит, все читается сразу. Правда в Read я передаю кол-во байт для чтения, которое узнаю из свойства "Available" TCP клиента...

Бинарная сериализация не подходит, т.к. сказать по условию задачи.

Добавлено через 1 минуту и 34 секунды
Цитата(Bogdan1024 @ 18.6.2009,  12:21)
Может при отправке не делается Flush и поэтому всё посылается разу только когда поток закрывается?

У networkstream нет метода Flush()
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1250 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.