|
C# DataSet
|
|||
---|---|---|---|
#18+
Добрый день! А кто скажет как можно десериализовать прямо из сокета? Или вопрос по другому - как по TCP сокетам передавать произвольный DataSet, размер которого заранее неизвестен? вот как делаю через память: Код: c# 1. 2. 3. 4. 5. 6.
я уже почти близко к цели, только когда было Код: c# 1. 2.
- небольшие датасеты без проблем десериализовались, а когда данных стало чутка поболее, полетели эксепшены... вот как можно сделать так, чтобы прямо из сокета объект десериализовался? Конструкция Код: c# 1.
не совсем правильная, так как ожидает аргумента другого класса, а у меня clientSocket - это TcpClient ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 16:12 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
5 сек - одна задумка есть! - пробую! ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 16:14 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Код: c# 1.
так вот написал, но нет десериализации походу... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 16:16 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
че-то кажется что написал некий бред, так как C# не знаю, сокетов не знаю.... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 16:25 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Сначала нужно сериализовать, затем конвертировать в byte[]/поток и только потом отправлять. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 17:40 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
skoleСначала нужно сериализовать, затем конвертировать в byte[]/поток и только потом отправлять. спасибо за информацию - я давно это сделал! проблема в том, что если датасет небольшой - все работает как надо, а если немного больше записей - нифига не работает - чувствую, что это как-то связано с размером пакетов, или я неправильно принимаю: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:00 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
как десериализовать датасеты грамотно? любого размера... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:01 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Проверь размер буфера на входе NetworkStream или читай и заполняй его снова в лупе while ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:13 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
skoleПроверь размер буфера на входе NetworkStream или читай и заполняй его снова в лупе while 8192 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:15 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
а аообще грамотно как датасет десериализовать? Код: c# 1. 2. 3.
если в итоге датасет в один пакет не влезет - клиенту будет отправленое несколько пакетов? - то есть сколько бы данных ни было - они в данном случае пакетами уйдут абсолютно все, и их нужно будет читать в цикле, проверяя, есть ли данные? то есть эта конструкция датасет целиком вытолкает в сеть? если да, то как тогда десериализовать - где хранить промежутобайты? - если в массиве, то как заранее узнать размер массива? вообщем я вообще ноль в C# поэтому задаю лавину наиглупейших вопросов... может кто подскажет простой пример принятия данных заранее неизвестного размера и десериализации оного объекта? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:22 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Во-первых, подумай, зачем тебе использовать целый датасет, это достаточно громоздкий объект со своими тараканами, используй что-нибудь попроще, какой-нибудь базовый объект, например DataTable, а лучше типизированную коллекцию, вида List<MyClass>. Затем пометь атрибутами нужные поля в случае коллекции, сериализируй, отправляй в потоке по TCP. На сервере читай входящий поток, если он большой, складывай во временный буфер byte[], как поток будет весь принят, отправляй на десериализацию. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:42 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
skoleВо-первых, подумай, зачем тебе использовать целый датасет, это достаточно громоздкий объект со своими тараканами, используй что-нибудь попроще, какой-нибудь базовый объект, например DataTable, а лучше типизированную коллекцию, вида List<MyClass>. Затем пометь атрибутами нужные поля в случае коллекции, сериализируй, отправляй в потоке по TCP. На сервере читай входящий поток, если он большой, складывай во временный буфер byte[], как поток будет весь принят, отправляй на десериализацию. все намного прозаичней - диплом делаю студенту - так там условие - клиент не знает ничего о БД, обращается к серверу (такое крохотное приложение), а сервер шлет в зависимости от того, о чем попросил клиент , запросы на сервак.... так я уже думаю - наверно проще построчно передать клиенту результат запроса - какая разница, если на клиенте нет вообще работы с БД может так логичней будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 18:52 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Galadriel75, .. еще проще будет формировать csv-файл, да и отдавать его клиенту ... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:13 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
carrotikGaladriel75, .. еще проще будет формировать csv-файл, да и отдавать его клиенту ... тоже вариант но опять же его нужно буддет сериализовать скорее всего кстати вот какое исключение на больших объемах данных выбивает: Конец потока обнаружен до завершения разбора - то есть я так понял - пришло пакетов несколько а принят только один? вот он и недополучил данные...? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:15 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
csv файл не очень изящное решение, годится только для поделки. Покажи, как читаешь NetworkStream на сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:36 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
skolecsv файл не очень изящное решение, годится только для поделки. Покажи, как читаешь NetworkStream на сервере. я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:47 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Galadriel75skolecsv файл не очень изящное решение, годится только для поделки. Покажи, как читаешь NetworkStream на сервере. я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet а читаю то что пришло вот как Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:49 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Galadriel75Galadriel75пропущено... я на сервере его не читаю - я с сервака клиенту пытаюсь передать DataSet а читаю то что пришло вот как Код: c# 1. 2. 3. 4.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
выше была десериализация а тут - чтение и всегда size дает 8192 - чую - что здесь как то неправильно читаются данные из потока ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:51 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Galadriel75Galadriel75пропущено... а читаю то что пришло вот как Код: c# 1. 2. 3. 4.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
выше была десериализация а тут - чтение и всегда size дает 8192 - чую - что здесь как то неправильно читаются данные из потока вот теперь я собственно начал читать по теме ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:54 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
и вижу, что я написал откровеннейшую фигню в этом методе! - уже начал читать матчасть и вроде начал осознавать сотворенный мною бред... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:57 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
с момента начала чтения матчасти уже вдруг решил кучку проблем... проверил догоадку - увеличил размер буфера ручками - данные пришли целиком... ошибка не появилась... копаю дальше ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 19:59 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
собственно, как узнать скока пришло байт ( NetworkStream) lenght - уже not supported... неохота заморачиваться с динамическими массивами и прочей лабудой ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 20:04 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
Вообще большие стримы надо читать в лупе, посмотри MSDN, там был пример для NetworkStream. Засвети DeserializeData(ReceivedBytes); что там делаешь, покажи ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 20:05 |
|
C# DataSet
|
|||
---|---|---|---|
#18+
skoleВообще большие стримы надо читать в лупе, посмотри MSDN, там был пример для NetworkStream. Засвети DeserializeData(ReceivedBytes); что там делаешь, покажи Код: c# 1. 2. 3. 4.
туда передается массив а есть ли способ на лету увеличивать размер массива, не юзая List<> или ArrayList? если есть, то я знаю как прочитать из буфера ровно стока, скока прислали ... |
|||
:
Нравится:
Не нравится:
|
|||
26.05.2013, 20:11 |
|
|
start [/forum/topic.php?fid=20&msg=38273893&tid=1404608]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 173ms |
0 / 0 |