| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Сохранение свойств объектов |
| Автор: zss 25.1.2005, 16:14 |
| Необходимо по завершению приложения сохранить все свойства объекта. А после повторного запуска восстановить их. Я использую для этого xml-файл. Но что-то сам себу усложняю жизнь У каждого объекта существует имя и набор свойств. Причем свойства имеют разные названия. Получается, что необходимо анализировать файл по константным названиям свойств. Хотелось бы это все автоматизировать. К примеру использовать класс Properties (к примеру со значениями по-умолчанию). Тоесть прочитать в него все свойства для определенного объекта, а после их восстановить. Или все-таки без анализа констант не обойтись ? Тоесть все-равно куча проверок и if-ов ? |
| Автор: redrick 25.1.2005, 16:22 |
| у Properties есть такие вот методы : public void store(OutputStream out, String comments) throws IOException public void load(InputStream inStream) throws IOException в этом классе как раз все и есть public String getProperty(String key) - никаких вам ифоф... |
| Автор: zss 25.1.2005, 16:43 |
| Проблемма в том, что данные надо хранить именно в xml |
| Автор: Domestic Cat 25.1.2005, 19:29 |
| Может это подойдет http://java.sun.com/j2se/1.4.2/docs/api/java/beans/XMLEncoder.html |
| Автор: zss 25.1.2005, 20:53 |
| Сложность в том, что помимо обычных свойств в xml будух храниться специфичные данные Объясню подробнее На одной машине запускается генератор xml файлов. Он отображает в файле какие объекты надо создать и с какими свойствами (а так же данные объекта) На второй машине приложение запускается из командной строки и читает файл. А на основе него создает объекты и заполняет их данными Тоесть надо анализировать xml. Вот поэтому и хотелось это все автоматизировать, так как объектов, свойств и данных может быть много и читать их (при этом анализируя) придется почти вручную. Более того сами свойства для разных объектов разные и их количество тоже отличается. Хотельсь одним махом прочитать свойства объекта, создать его и одним махом задать свойства Или я многого хочу сразу |
| Автор: Domestic Cat 26.1.2005, 03:10 |
| Во-первых, если ХМЛ необязателен, можно воспользоваться сериализацией через ObjectOutput/InputStream. Во-вторых, если через ХМЛ, то для этой цели используется SOAP http://java.sun.com/xml/saaj/index.jsp http://java.sun.com/webservices/index.jsp И вообще это все похоже на веб-сервис. |
| Автор: Шмель 26.1.2005, 06:42 |
| Возможно, подойдет библиотека http://jakarta.apache.org/commons/betwixt/ от Jakarta Project |
| Автор: zss 26.1.2005, 10:01 |
| Думаю, что не подойдет. Все должно быть максимально просто (одно из условий) Файл, наверное, будет хранится в БД. Его надо просто брать оттуда и читать |
| Автор: 3,14 26.1.2005, 10:40 | ||||
А зачем хранить XML файл в БД, как правило это нужно для БОЛЬШИХ обьёмов информации, а если всё должно быть сделано
то зачем усложнять себе этим жизнь? А вообще согласен с Domestic Cat, тут удобней SOAP использовать |
| Автор: zss 26.1.2005, 12:16 | ||
Да не очень бы хотелось привязываться к этому |
| Автор: 3,14 26.1.2005, 12:52 | ||
Почему? ИМХО очень удобно. |
| Автор: Domestic Cat 26.1.2005, 12:53 | ||
Точно. |
| Автор: zss 26.1.2005, 13:30 |
| Domestic Cat (3,14), я уже говорил, что не дружу с английским. Я не очень понял идею SOAP. Нашел описание на русском, но там муть какая-то. Можно в общих чертах об этой технологии. Спасибо |
| Автор: 3,14 26.1.2005, 14:14 |
| М-да, тяжко с доками по SOAP на русском, но кое что нашёл, вот общие сведения по SOAP : http://www.uneta.org/article.aspx?article=5839B3B1-79AE-44DB-AC04-11E346B6D4E3 А вот пременение SOAP с использованием axis (apache-вские либы для разработки веб сервисов): http://www.prefnews.ru/articles/axis/ |
| Автор: zss 26.1.2005, 14:32 |
| Идея понятна. Спасибо. А что если этот файл необходимо бет читать сразу нескольким приложениям - тогда придется отсылать каждому ? |
| Автор: 3,14 26.1.2005, 14:37 | ||
Вообще говоря, есть несколько вариантов, либо отсылаешь каждому, либо сохраняешь в доступном для клиентских приложений ресурсе. |
| Автор: zss 26.1.2005, 15:46 | ||||||
| Я вроде нашел решение. Чтоб избавиться от анализа руками я написал два рекурсивных метода, которые позволяют найти любую ноду во всей иерархии xml документа Два метода потому, что названия нод могут повторяться на одном уровне (если такого нет, то достаточно вызова первого метода) К примеру (повторяются properties)
Так вот если я хочу найти например список всех свойств для 2 объекта, то достаточно вызвать
Сами методы
Здесь осуществляется рекурсия для любого уровня вложенности Правда пока не до конца протестил, но пока вроде пашет (может кому и еще пригодится |
| Автор: 3,14 26.1.2005, 15:53 |
| А если что-то измениться в описании обьекта весь код будешь переписывать? |
| Автор: zss 26.1.2005, 16:15 |
| Так в твоем случае ведь тоже придется анализировать (или ты хочешь сказать, что это делается атоматом ?) Ведь отсылая сообщение надо знать описание объекта |
| Автор: 3,14 27.1.2005, 18:27 | ||||
Вообще говоря можно сделать вариант при к-ом не нужно будет прилагать практически никаких усилий даже при смене кода, но ежели надо записать в XML что-то простое - то пожайлуста, вот пример записи в SOAP документ Hasstable-а (немного изменённый вариант кода взятого с http://www-106.ibm.com/developerworks/webservices/library/ws-soapmap2/):
Результат:
Если тебе интересен вариант типа этого спрашивай, расскажу дальше. Чуть не забыл, для запуска приложения (для компиляции не надо), так же нужны apache-вские mail.jar и activation.jar, пути к ним должны стоять в classpath. |
| Автор: zss 28.1.2005, 15:57 |
| 3,14, спасибо - попробую разобраться Кстати, а существует ли иерархический класс в java (что-то вроде иерархическрго списка) |
| Автор: 3,14 28.1.2005, 17:22 |
| Чего-то вроде класс Tree нету (хотя разных реализаций по нету выше крыше), вообще говоря класса Map как правило вполне достаточно. К примеру используешь в качестве ключа корневой эл-т а в качестве обьекта хранения - список потомков. Если же тебе нужно дерево для работы с xml то это совсем другое дело. |
| Автор: zss 28.1.2005, 19:27 | ||
ага |
| Автор: Domestic Cat 28.1.2005, 20:18 | ||
Как это нету??? А JTree? Совсем ведь необязательно чтобы оно рисовалось, можно и так им пользоваться. |
| Автор: LSD 29.1.2005, 01:24 | ||
Лучше ограничится TreeModel, вернее его реализациями, например DefaultTreeModel. zss А зачем тебе отдельное дерево, чем DOM плох? |
| Автор: zss 29.1.2005, 14:16 | ||
Я перевожу данные из xml-файла в собственную иерархическую структуру, которая удобна для доступа к данным. Пока уровень вложенности = 3. Но данные преобразуются к определенному виду. Node - имеет имя и список subnode. Subnode - имеет имя и свойства. Свойства двуч видов. Если использовать DOM, то это заново придется анализировать, а так я пока обхожусь ArrayList |
| Автор: LSD 29.1.2005, 17:49 |
| Тогда посмотри DefaultTreeModel, вот тебе готовая древовидная структура. Плюс еще в том, что при желании отобразить ее будет элементарно. |
| Автор: zss 2.2.2005, 10:04 |
| В общем я долго общался с людьми на счет SOAP, так вот они отказываются от этого и хотят увидеть именно создание xml и доступ к нему по сети. при этом возникают следующие проблеммы: 1. Необходимо запустить серверное приложение и создать xml 2. На клиентской машине запустить приложение. При этом оно должно знать где находится этот xml. Тоесть либо задавать путь к нему через командную строку, либо удаленно запускать само приложение с указанием пути (больше я ничего не придумал) 3. Прочитать xml с сервера локальной сети (А как это сделать ?) Что Вы можете предложить ? Или может быть есть еще какие варианты ? Особенно интересует пункт 3. |
| Автор: 3,14 2.2.2005, 16:01 | ||
| 1. Создать сервлет к-ый по запросу генерирует требуемый XML документ 2. В качестве указания пути использовать URL доступа к сервлету 3. Если средствами java то
Ну а читать из InputStream ты наверное умеешь |
| Автор: zss 2.2.2005, 20:11 | ||
Что-то не очень понял |
| Автор: 3,14 3.2.2005, 11:23 | ||
Что ж тут непонятного? Поднял ты какой-то сервлет, чтоб обратится к нему через браузер ты используешь какой либо URL, к примеру "http://xml_servlet", или же "http://my_server/servlet/my_servlet", вот эту строку и подаёшь в качестве входного параметра для класса URL. |