![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
V1tal1us |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2007 Репутация: нет Всего: нет |
Подскажите как XML-RPC клиенту получить от XML-RPC сервера обьект типа ResultSet, ну а xmlrpc-серверу соотвественно как его передать.
Просьба не писать что то типа : RTFM или пойди по-гугли. ![]() Спецификацию Я читал, и понимаю что Extensible Markup Language Remote Procedure Call не умеет передавать такие типы данных. Но нет ничего не возможного в этой галактике! Может кто то все таки обошел это ограничение??? ![]() Возможен ли такой вариант : Кодировать ResultSet в base64 на стороне сервера , а потом декодировать на стороне клиента обратно в ResultSet ??? ![]() |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Никогда не имел дело с XML-RPC, зато представляю, что такое ResultSet. Поэтому рискну ответить: никак. ResultSet - не сериализуемый обьект. Это - буфер сокетного соединения с базой. И содержимое буфера может динамически изменяться. Мы вытаскиваем оттуда строки методом next(), а буфер может синхронно подгружаться из базы. Подозреваю, что этот вопрос вызван ситуацией, когда передаваемый xml обьект очень большой и есть идея его начать обрабатывать не дожидаясь момента, когда он полностью будет загружен. В данной ситуации можно сымитировать интерфейс ResultSet. На серверной стороне должен быть реализован метод next(), который возвращает следующую порцию данных. Но каждый вызов next - это передача запроса по сети. Это сообщение отредактировал(а) COVD - 13.3.2008, 15:04 |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Совершенно верно, никак. Но скорее не из-за того, что он не сериализуемый (ResultSet вообще по сети передать не получится никаким способом), а в данном случае из-за ограничений самого XML-RPC, который умеет только простые бины передавать. |
|||
|
||||
mbasil |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 399 Регистрация: 4.5.2007 Где: Москва Репутация: 2 Всего: 13 |
Постойте, а как же интерфейс RowSet (и в частности XMLRowSet), который расширяет ResultSet?
Он сериализуемый и отсоединяемый - для того и придуман. То есть RowSet можно сериализовать и передавать в SOAP Attachment. А XMLRowSet можно, очевидно передавать и в Body. С год назад пробовал использовать реализацию RowSet SUN и Oracle. Реализация Oracle работает без особых "глюков", а с реализацией SUN были проблемы. Впрочем сейчас, наверное, дело обстоит получше. |
|||
|
||||
tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Вообще говоря, с XML-RPC все посложнее выглядит за счет того, что он сам попроще. Вот все возможные типы данных: array, base64, boolean, date/time, double, integer, string, struct, nil. Никаких аттачментов нет. В принципе да, можно взять RowSet, сериализовать, закодировать в base64 и так передавать. Или XMLRowSet передавать строкой, а потом парсить. Только кажется гораздо проще перегнать данные в массив бинов и передавать структуры.
|
|||
|
||||
VSergeyV |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 299 Регистрация: 9.5.2006 Где: Новосибирск Репутация: нет Всего: 3 |
||||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Рискну заметить, что сериализация ResultSet не обязательно должна заключаться в попытке записи этого объекта в ObjectOutputStream. Можно передавать параметры для его повторного получения, можно передавать обёртку. А передавать по XML-RPC можно объекты любой сложности - для этого нужно только написать свои сериализатор и десериализатор XML.
-------------------- ![]() ![]() |
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
ResultSet не имеет смысла в отрыве от сокетного соединения с базой, его породившего. В момент возвращения обьекта ResultSet методом executeQuery() он не обязан иметь в своем буфере всю выборку данных. Он (обьекта ResultSet ), наверное, вообще может быть пуст в этот момент (нечего сериализовать или обертывать!). Очевидно, данные из базы могут синхронно подгружаться по мере вызова next(). Только в этом случае имеет смысл организация доступа к данным a la iterator , т.е. в виде next(). Иначе можно было бы результатом executeQuery иметь просто ссылку на коллекцию. И отсюда следует. что "повторно" получить или воссоздать ResultSet можно лишь создав новое соединение с базой данных. |
|||
|
||||
w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
Можно создать обёртку ResultSet, которая будет самостоятельно лазить на сервер к реальному объекту ResultSet и дёргать его там. Эту обёртку и десериализовывать. -------------------- ![]() ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |