powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# DataSet
25 сообщений из 60, страница 1 из 3
C# DataSet
    #38273711
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

А кто скажет как можно десериализовать прямо из сокета? Или вопрос по другому - как по TCP сокетам передавать произвольный DataSet, размер которого заранее неизвестен?
вот как делаю через память:
Код: c#
1.
2.
3.
4.
5.
6.
           
 //var ms = new MemoryStream(theByteArray);
var ms = new NetworkStream(clientSocket);
            var bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (DataSet)bf1.Deserialize(ms);



я уже почти близко к цели, только когда было
Код: c#
1.
2.
           
var ms = new MemoryStream(theByteArray); 

- небольшие датасеты без проблем десериализовались, а когда данных стало чутка поболее, полетели эксепшены...
вот как можно сделать так, чтобы прямо из сокета объект десериализовался? Конструкция
Код: c#
1.
 var ms = new NetworkStream(clientSocket); 

не совсем правильная, так как ожидает аргумента другого класса, а у меня clientSocket - это TcpClient
...
Рейтинг: 0 / 0
C# DataSet
    #38273713
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 сек - одна задумка есть! - пробую!
...
Рейтинг: 0 / 0
C# DataSet
    #38273716
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
NetworkStream ms = clientSocket.GetStream();


так вот написал, но нет десериализации походу...
...
Рейтинг: 0 / 0
C# DataSet
    #38273724
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че-то кажется что написал некий бред, так как C# не знаю, сокетов не знаю....
...
Рейтинг: 0 / 0
C# DataSet
    #38273779
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала нужно сериализовать, затем конвертировать в byte[]/поток и только потом отправлять.
...
Рейтинг: 0 / 0
C# DataSet
    #38273804
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleСначала нужно сериализовать, затем конвертировать в byte[]/поток и только потом отправлять.
спасибо за информацию - я давно это сделал!

проблема в том, что если датасет небольшой - все работает как надо, а если немного больше записей - нифига не работает - чувствую, что это как-то связано с размером пакетов, или я неправильно принимаю:

Код: c#
1.
2.
3.
4.
     var ms = new MemoryStream(theByteArray);
     var bf1 = new BinaryFormatter();
     ms.Position = 0;
     return (DataSet)bf1.Deserialize(ms);
...
Рейтинг: 0 / 0
C# DataSet
    #38273807
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как десериализовать датасеты грамотно? любого размера...
...
Рейтинг: 0 / 0
C# DataSet
    #38273822
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь размер буфера на входе NetworkStream или читай и заполняй его снова в лупе while
...
Рейтинг: 0 / 0
C# DataSet
    #38273827
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleПроверь размер буфера на входе NetworkStream или читай и заполняй его снова в лупе while
8192
...
Рейтинг: 0 / 0
C# DataSet
    #38273836
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а аообще грамотно как датасет десериализовать?
Код: c#
1.
2.
3.
 // Отправка table клиенту
            Stream.Write(SerializeData(ds), 0, SerializeData(ds).Length);
            Stream.Flush();



если в итоге датасет в один пакет не влезет - клиенту будет отправленое несколько пакетов? - то есть сколько бы данных ни было - они в данном случае пакетами уйдут абсолютно все, и их нужно будет читать в цикле, проверяя, есть ли данные?
то есть эта конструкция датасет целиком вытолкает в сеть?
если да, то как тогда десериализовать - где хранить промежутобайты? - если в массиве, то как заранее узнать размер массива?
вообщем я вообще ноль в C# поэтому задаю лавину наиглупейших вопросов...
может кто подскажет простой пример принятия данных заранее неизвестного размера и десериализации оного объекта?
...
Рейтинг: 0 / 0
C# DataSet
    #38273844
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, подумай, зачем тебе использовать целый датасет, это достаточно громоздкий объект со своими тараканами, используй что-нибудь попроще, какой-нибудь базовый объект, например DataTable, а лучше типизированную коллекцию, вида List<MyClass>. Затем пометь атрибутами нужные поля в случае коллекции, сериализируй, отправляй в потоке по TCP.

На сервере читай входящий поток, если он большой, складывай во временный буфер byte[], как поток будет весь принят, отправляй на десериализацию.
...
Рейтинг: 0 / 0
C# DataSet
    #38273849
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleВо-первых, подумай, зачем тебе использовать целый датасет, это достаточно громоздкий объект со своими тараканами, используй что-нибудь попроще, какой-нибудь базовый объект, например DataTable, а лучше типизированную коллекцию, вида List<MyClass>. Затем пометь атрибутами нужные поля в случае коллекции, сериализируй, отправляй в потоке по TCP.

На сервере читай входящий поток, если он большой, складывай во временный буфер byte[], как поток будет весь принят, отправляй на десериализацию.
все намного прозаичней - диплом делаю студенту - так там условие - клиент не знает ничего о БД, обращается к серверу (такое крохотное приложение), а сервер шлет в зависимости от того, о чем попросил клиент , запросы на сервак.... так я уже думаю - наверно проще построчно передать клиенту результат запроса - какая разница, если на клиенте нет вообще работы с БД

может так логичней будет?
...
Рейтинг: 0 / 0
C# DataSet
    #38273859
carrotik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75,

.. еще проще будет формировать csv-файл, да и отдавать его клиенту ...
...
Рейтинг: 0 / 0
C# DataSet
    #38273862
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
carrotikGaladriel75,

.. еще проще будет формировать csv-файл, да и отдавать его клиенту ...
тоже вариант

но опять же его нужно буддет сериализовать скорее всего

кстати вот какое исключение на больших объемах данных выбивает:

Конец потока обнаружен до завершения разбора - то есть я так понял - пришло пакетов несколько а принят только один?
вот он и недополучил данные...?
...
Рейтинг: 0 / 0
C# DataSet
    #38273873
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csv файл не очень изящное решение, годится только для поделки.
Покажи, как читаешь NetworkStream на сервере.
...
Рейтинг: 0 / 0
C# DataSet
    #38273886
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skolecsv файл не очень изящное решение, годится только для поделки.
Покажи, как читаешь NetworkStream на сервере.
я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet
...
Рейтинг: 0 / 0
C# DataSet
    #38273893
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75skolecsv файл не очень изящное решение, годится только для поделки.
Покажи, как читаешь NetworkStream на сервере.
я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet
а читаю то что пришло вот как
Код: c#
1.
2.
3.
4.
 var ms = new MemoryStream(theByteArray);
            var bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (DataSet)bf1.Deserialize(ms);
...
Рейтинг: 0 / 0
C# DataSet
    #38273898
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75Galadriel75пропущено...

я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet
а читаю то что пришло вот как
Код: c#
1.
2.
3.
4.
 var ms = new MemoryStream(theByteArray);
            var bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (DataSet)bf1.Deserialize(ms);



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
                NetworkStream Stream = clientSocket.GetStream();
                int size = (int)clientSocket.ReceiveBufferSize;
                byte[] ReceivedBytes = new byte[size];
                //   MessageBox.Show(size.ToString());
                Stream.Read(ReceivedBytes, 0, size);
                data = DeserializeData(ReceivedBytes);
                data.WriteXml("aaa1.xml");
                dataGridView1.DataSource = data.Tables[0].DefaultView;
                Stream.Close();



выше была десериализация
а тут - чтение
и всегда size дает 8192 - чую - что здесь как то неправильно читаются данные из потока
...
Рейтинг: 0 / 0
C# DataSet
    #38273899
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Galadriel75Galadriel75пропущено...

а читаю то что пришло вот как
Код: c#
1.
2.
3.
4.
 var ms = new MemoryStream(theByteArray);
            var bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (DataSet)bf1.Deserialize(ms);



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
                NetworkStream Stream = clientSocket.GetStream();
                int size = (int)clientSocket.ReceiveBufferSize;
                byte[] ReceivedBytes = new byte[size];
                //   MessageBox.Show(size.ToString());
                Stream.Read(ReceivedBytes, 0, size);
                data = DeserializeData(ReceivedBytes);
                data.WriteXml("aaa1.xml");
                dataGridView1.DataSource = data.Tables[0].DefaultView;
                Stream.Close();



выше была десериализация
а тут - чтение
и всегда size дает 8192 - чую - что здесь как то неправильно читаются данные из потока

вот теперь я собственно начал читать по теме
...
Рейтинг: 0 / 0
C# DataSet
    #38273902
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и вижу, что я написал откровеннейшую фигню в этом методе! - уже начал читать матчасть и вроде начал осознавать сотворенный мною бред...
...
Рейтинг: 0 / 0
C# DataSet
    #38273903
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с момента начала чтения матчасти уже вдруг решил кучку проблем... проверил догоадку - увеличил размер буфера ручками - данные пришли целиком... ошибка не появилась... копаю дальше
...
Рейтинг: 0 / 0
C# DataSet
    #38273908
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
собственно, как узнать скока пришло байт ( NetworkStream) lenght - уже not supported...
неохота заморачиваться с динамическими массивами и прочей лабудой
...
Рейтинг: 0 / 0
C# DataSet
    #38273909
Фотография skole
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще большие стримы надо читать в лупе, посмотри MSDN, там был пример для NetworkStream.

Засвети DeserializeData(ReceivedBytes); что там делаешь, покажи
...
Рейтинг: 0 / 0
C# DataSet
    #38273915
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skoleВообще большие стримы надо читать в лупе, посмотри MSDN, там был пример для NetworkStream.

Засвети DeserializeData(ReceivedBytes); что там делаешь, покажи

Код: c#
1.
2.
3.
4.
var ms = new MemoryStream(theByteArray);
            var bf1 = new BinaryFormatter();
            ms.Position = 0;
            return (DataSet)bf1.Deserialize(ms);


туда передается массив
а есть ли способ на лету увеличивать размер массива, не юзая List<> или ArrayList?
если есть, то я знаю как прочитать из буфера ровно стока, скока прислали
...
Рейтинг: 0 / 0
C# DataSet
    #38273919
Galadriel75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаю через List
...
Рейтинг: 0 / 0
25 сообщений из 60, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]