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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача сериализованного объекта 
:(
    Опции темы
Ronin08
Дата 15.9.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

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



Доброго времени суток
Необходимо передать с клиента на сервер несколько параметров рахных типов (int, string, image). Я их засунул в класс, сериализовал объект в XML формат и теперь хочу передать его серверу. 
Код

//Сериализую объект
StreamWriter writer = new StreamWriter("Customer.xml");
 XmlSerializer serializer = new XmlSerializer(typeof(Customer_Serialize));
 serializer.Serialize(writer, Customer);
 writer.Close();
//Создаю соединение с сервером
TcpClient eClient = new TcpClient("localhost", ECHO_PORT);

А вот передать не выходит. Мучал NetworkStream, но проблемы.
Можете накидать небольшой примерчик.
И еще, может лучше обойтись без сериализации в моем случае?
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
PashaPash
Дата 15.9.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ronin08, берешь пример из msdn и заменяешь в нем строчку stream.Write(...); на serializer.Serialize(stream, Customer).


--------------------
PM MAIL WWW   Вверх
Ronin08
Дата 15.9.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

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



я примерно так и делал, но как мне перевести сериализованный объект в массив байт
Код

Byte[] data = System.Text.Encoding.ASCII.GetBytes(???);

--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
QryStaL
Дата 15.9.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


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

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





--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
PashaPash
Дата 18.9.2008, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Ronin08 @  15.9.2008,  12:54 Найти цитируемый пост)
я примерно так и делал, но как мне перевести сериализованный объект в массив байт

Не надо переводить, это за тебя сделает serializer. Делаешь прямо:
Код

NetworkStream stream = client.GetStream();

serializer.Serialize(stream, Customer);



--------------------
PM MAIL WWW   Вверх
Ronin08
Дата 20.9.2008, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

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



всем спасибо, разобрался
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Ronin08
Дата 22.9.2008, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

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



Возникла еще одна проблемма связанная с этой темой!
Необходимо передавать с клиента на сервер число (Customer.Number ) через промежуток времени, но проблема при десериализации.
ошибка 
Цитата
There is an error in XML document
 на строке 
Customer_Serialize reCustomer = (Customer_Serialize)desirializer.Deserialize(readerStream);
клиент
Код

            try
            {
                TcpClient eClient = new TcpClient("localhost", ECHO_PORT);
                while (true)
                {
                    Random RandomNumber = new Random();
                    Customer.Number = RandomNumber.Next();
                    NetworkStream writerStream = eClient.GetStream();
                    serializer.Serialize(writerStream, Customer);
                    Thread.Sleep(1000);
                 }
            }

сервер
Код

public void RubClient()
        {
            StreamReader readerStream = new StreamReader(clientSocket.GetStream());
            XmlSerializer desirializer = new XmlSerializer(typeof(Customer_Serialize));
            Customer_Serialize reCustomer = (Customer_Serialize)desirializer.Deserialize(readerStream);

            while (true)
            {
                Console.WriteLine("Customer Name = {0}", reCustomer.CustomerName);
                Console.WriteLine("Customer Number = {0}", reCustomer.Number);
                Console.Read();
            }
        }

В чем может быть ошибка?


Это сообщение отредактировал(а) Ronin08 - 22.9.2008, 01:09
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
Darisvet
Дата 6.11.2008, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

StreamReader readerStream = new StreamReader(clientSocket.GetStream());
XmlSerializer desirializer = new XmlSerializer(typeof(Customer_Serialize));


Проверь в дебаггере по F11 что содержит readerStream - поскольку сервер может вызвать этот обработчик ДО того, как что-то пришло. Т.е. без клиента. Соответственно поток пустой. Обрабатывать может быть попросту нечего. Соответственно метод Deserialize не может работать с пустым значением... 
Вариант решения - сделать поток (uses System.Threading;)... соответственно написать обработчик потока. Когда подключается клиент - выделяется поток, и в нем уже идёт работа с клиентом. В принципе стандартный приём порграммирования неблокирующих сокетов. Тогда данные уж всяко будут. 

Код

uses System.Threading;
uses System.Xml.Serialization;
uses System.IO;
// .......

public void ClientAccept() // Подключился клиент? Выделить ему новый поток.
{
    Thread t = new Thread(DoThread);
    t.Start();
}

public void DoThread() // Вся обработка клиентских данных.
{
    StreamReader readerStream= new StreamReader(clientSocket.GetStream());
    XmlSerializer desirializer = new XmlSerializer(typeof(Customer_Serialize));
    //..............
}

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

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




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


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

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