|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Добрый день, коллеги. Столкнулся с необходимостью передавать эффективно данные с сервиса на клиент. Сейчас передает сериализованный в xml datatable. Естественно большой overhead. Необходимо как-то плавно переплыть к бинарной кодировке сообщений и эффективному контейнеру передачи (List<T>). DTO нет. Есть тока xml дататейблов. Можно ли как - то конвертить тейблы к спискам, или клиент не сможет все это дело десериализовать? А может linq в помощь? Вообщем, не обладаю большим опытом в этом, прошу совета как бы эффективнее бы послать тейбл через wcf. PS На клиенте все операции опять идут с DataTable. PSS: Http,Tcp биндинги ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2010, 20:21 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Hug, давай выложи объем оверхеда в килобайтах, и прикинем, есть ли ,что с меньшим оверхедом. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2010, 11:05 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Hug Таскать таблицы - не кошерно. Безусловно надо переходить к коллекциям. DTO можно и написать. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2010, 11:18 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Переходить на коллекции надо естественно и сервером и клиентом одновременно. Нельзя передать коллекции, а принять таблицы ;) По поводу бинарной кодировки - тоже верное направление. Вот некоторый промежуточный вариант - использование массива object, вместо datatable. Велосипед конечно. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2010, 00:45 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Переходить не имею возможности (Куча legacy кода с DataTable) Объем оверхеда = разница между xml с кучой полей и binary. Покурю Ваш велосипед. На запас оставлю gzip=>byte[]=>mtom Всем спасибо большое за участие. Отпостюсь о результатах. Считаю тема очень актуальная. Многие скоро начнут свое старое asmx(времен 1.0, без генериков, с датасетами) переводить на wcf. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2010, 10:58 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
HugМногие скоро начнут свое старое asmx(времен 1.0, без генериков, с датасетами) переводить на wcf. уже начали... точнее - ПОНАЧИНАЛИ и забили : ) ибо, озадачились простым вопросом - а оно зачем надо (менять)? уже 5 лет работает и, если не трогать , ещё не один раз по 5 лет проработает мудрые говорят: лучшее - враг хорошего ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2010, 11:07 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Шайтан, +1 P.S. Зачем ломать то, что прекрасно работает. Новые проекты, да - на WCF, тут всё правильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2010, 11:26 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
тут посмотри я использую тесты RsdnDetaSerializer Serialization: 150 ms Loading: 450 Length: 1 053 824 bytes Serialization: 140 ms Loading: 451 Length: 1 053 824 bytes Serialization: 140 ms Loading: 451 Length: 1 053 824 bytes BinaryFormatter Serialization: 2 123 ms Loading: 7 631 Length: 6 985 259 bytes Serialization: 1 773 ms Loading: 7 701 Length: 6 985 259 bytes Serialization: 1 773 ms Loading: 7 701 Length: 6 985 259 bytes XmlSerializer Serialization: 1 793 ms Loading: 7 591 Length: 9 309 050 bytes Serialization: 1 652 ms Loading: 7 561 Length: 9 309 050 bytes Serialization: 1 662 ms Loading: 7 561 Length: 9 309 050 bytes SoapFormatter Serialization: 2 594 ms Loading: 9 233 Length: 11 001 874 bytes Serialization: 2 573 ms Loading: 9 173 Length: 11 001 874 bytes Serialization: 2 554 ms Loading: 9 163 Length: 11 001 874 bytes ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2010, 11:57 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabas, что еще хотелось бы узнать,это какой процессор и сколько памяти использовали для теста. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2010, 12:17 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
Hug, 12 окт 10, 20:21 [9596316] Посмотри здесь , в конце статьи приведены и цифры и вывод. С уважением, Владимир. p.s. DateSet сериализуем. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2010, 12:33 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
AlexeiKbarrabas, что еще хотелось бы узнать,это какой процессор и сколько памяти использовали для теста. эти тесты автора, свои я не помню (сейчас дома, а не на работе), там же есть исходник просто запусти в новом проекте, на своей машине. у себя еще gzip использую причем судя по форуму уже 2я версия, а я давно уже юзаю (подпиливал под себя) возможно и первую версию, по сути можно выкинуть версии строк, мне они не нужны ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2010, 12:44 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabasAlexeiKbarrabas, что еще хотелось бы узнать,это какой процессор и сколько памяти использовали для теста. эти тесты автора, свои я не помню (сейчас дома, а не на работе), там же есть исходник просто запусти в новом проекте, на своей машине. у себя еще gzip использую причем судя по форуму уже 2я версия, а я давно уже юзаю (подпиливал под себя) возможно и первую версию, по сути можно выкинуть версии строк, мне они не нужны хотя нет, там 2003год, значит эта версия, я не так давно этим озадачился ... |
|||
:
Нравится:
Не нравится:
|
|||
21.10.2010, 12:46 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabas тут посмотри я использую Хм. Это для того чтобы потом подсунуть сериализованные данные в виде DataTable - например в ObjectDataSource - надо еще свою обертку написать, которая будет десериализовать? Или можно как-то по другому извернуться? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 15:49 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
hstasbarrabas тут посмотри я использую Хм. Это для того чтобы потом подсунуть сериализованные данные в виде DataTable - например в ObjectDataSource - надо еще свою обертку написать, которая будет десериализовать? Или можно как-то по другому извернуться? так там сериализатор и десиализатор сериализуешь в byte[], зипуешь если нужно, передаешь кленту, а на клиенте десериализуешь в DS или DataTable зачем обертку? это класс для компактной записи инфы из датасета, как я понял тупо без всяких лишних тегов пишет в определённо порядке инфу через разделитель, и читает обратно в датасет ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 16:28 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabas так там сериализатор и десиализатор сериализуешь в byte[], зипуешь если нужно, передаешь кленту, а на клиенте десериализуешь в DS или DataTable зачем обертку? это класс для компактной записи инфы из датасета, как я понял тупо без всяких лишних тегов пишет в определённо порядке инфу через разделитель, и читает обратно в датасет Это я все вижу. Просто получается, метод WCF сервиса, будет возвращать не DataTabel или DataSet, а сериализованный контент. А такой метод нельзя указазать для ObjectDataSource. Надо будет писать врапер, который будет дергать функции WCF сервиса, и полученное десериализовать в DataTable. Сейчас у меня декларативно указано Код: plaintext 1. 2. 3. 4.
Где GetOrdersMmts - это метод WCF сервиса (LcrServiceReference.LcrWebService), возвращает DataTable. Если он начнет возвращать сериализованный вручную контейнер - без доп обертки не обойтись. Не? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 16:53 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
ну да, конечно нужно будет создать метод в котором вызовет метод сервиса и результат десериализует в таблицу. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 17:54 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
чего то я не понял, как GetOrdersMmts у вас возвращает DataTable? Почему у меня не получилось создать OperationContract возвращающий произвольную таблицу. у вас там прям [OperationContract] DataTable GetOrdersMmts(); ?? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 18:00 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabasчего то я не понял, как GetOrdersMmts у вас возвращает DataTable? Почему у меня не получилось создать OperationContract возвращающий произвольную таблицу. у вас там прям [OperationContract] DataTable GetOrdersMmts(); ?? ну да Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.10.2010, 21:38 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
hstasbarrabasчего то я не понял, как GetOrdersMmts у вас возвращает DataTable? Почему у меня не получилось создать OperationContract возвращающий произвольную таблицу. у вас там прям [OperationContract] DataTable GetOrdersMmts(); ?? ну да Код: plaintext 1.
а понял нужно имя давать DataTable иначе ошибка (оказывается известная фишка) но rsdn метод эффективнее передает большие объемы, т.ч. на нем оставлю да и я не вызываю проксю напрямую, у меня класс обертка для нее есть, т.к. в проксе только один метод в которую передаю имя действия параметры для него, а уж параметры и результат зависит от имени метода ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 06:48 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
>barrabas, 27.10.2010, 17:54 [9687314] >ну да, конечно нужно будет ... Зная структуру сериализации полей данных исходого объекта, десериализовать на приемнике можно и в объект другого типа, например, не в таблицу, а список, что содержится в объекте класса данных. С уважением, Владимир ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 10:41 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
ВМоисеев>barrabas, 27.10.2010, 17:54 [9687314] >ну да, конечно нужно будет ... Зная структуру сериализации полей данных исходого объекта, десериализовать на приемнике можно и в объект другого типа, например, не в таблицу, а список, что содержится в объекте класса данных. С уважением, Владимир ну тогда и передавать можно было коллекцию объектов, просто зачастую нужно передать компиляцию из многих объектов для простого отображения (ну отчёт например, пара полей из обного объекта, пара из другого, какието вычисления по третьему), передавать объекты целиком на клиента и там их обрабатывать не всегда эффективнее, чаще лучше написать селект в БД и передать результат, как произвольный дататайбл, для отчёта ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 11:09 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabasВМоисеев>barrabas, 27.10.2010, 17:54 [9687314] >ну да, конечно нужно будет ... Зная структуру сериализации полей данных исходого объекта, десериализовать на приемнике можно и в объект другого типа, например, не в таблицу, а список, что содержится в объекте класса данных. С уважением, Владимир ну тогда и передавать можно было коллекцию объектов, просто зачастую нужно передать компиляцию из многих объектов для простого отображения (ну отчёт например, пара полей из обного объекта, пара из другого, какието вычисления по третьему), передавать объекты целиком на клиента и там их обрабатывать не всегда эффективнее, чаще лучше написать селект в БД и передать результат, как произвольный дататайбл, для отчёта а плодить объекты типа Запись для отчёта 1 как то глупо ихмо ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 11:10 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
потестил я этот сериализатор. большого выигрыша если честно, я не заметил. Но с помощью тестов, я нашел одну нехорошую у меня в сервисе вещь. Сейчас еще разок проверю, отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 11:32 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
hstasпотестил я этот сериализатор. большого выигрыша если честно, я не заметил. Но с помощью тестов, я нашел одну нехорошую у меня в сервисе вещь. Сейчас еще разок проверю, отпишусь. gzip прикрутил? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 11:55 |
|
WCF. Эффективнее передать DataSet
|
|||
---|---|---|---|
#18+
barrabashstasпотестил я этот сериализатор. большого выигрыша если честно, я не заметил. Но с помощью тестов, я нашел одну нехорошую у меня в сервисе вещь. Сейчас еще разок проверю, отпишусь. gzip прикрутил? Неа. Как прикручивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.10.2010, 13:23 |
|
|
start [/forum/topic.php?fid=19&msg=36924549&tid=1397565]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
175ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 297ms |
0 / 0 |