?

Log in

No account? Create an account

Previous Entry

Теперь уже в этой теме прошу писать всех, кто хотел бы что-то обсудить – статьи на сайте или же просто какие-то интересные/актуальные вопросы. По результатам сбора пожеланий опять-таки будут созданы темы для обсуждения. Или же статьи, что тоже реально.

Я был бы рад, если бы анонимные комментарии и вопросы были подписаны – проще отвечать.

Comments

(Anonymous)
Aug. 30th, 2010 06:44 am (UTC)
Хранение базы данных на диске
Здравствуйте, Евгений!

Сейчас разрабатываю программу для тестирования (наподобие экзамена на водительского удостоверения).

Передо мной стоит вопрос: как хранить тесты на диске?

Первой была мысль о сериализации. Однако, прочитав Вашу статью, понял, что могу потерять всю информацию, если изменю класс, в объектах которого она хранится.

Была попытка работы с БД Derby. Однако, пока неудачная - потребуется значительное время, чтобы ее освоить.

В одной из своих статей Вы писали, что можете "сориентировать" в каком направлении нужно двигаться, п.ч. новичку быстро изучить все доступные варианты и затем выбрать подходящий - задача неподъемная.

Евгений, скажите, пожалуйста, какой технологией воспользовались бы Вы в таком проекте?

Алексей Яблоков
PS Был очень приятно удивлен, увидев свое имя в статье про jar'ы и на главной страничке сайта! Спасибо! :)
skipy_ru
Aug. 30th, 2010 07:42 am (UTC)
Re: Хранение базы данных на диске
Добрый день, Алексей!

Я бы ориентировался на XML+цифровая подпись, чтобы не могли изменять. Подписываете закрытым ключом, с приложением идет открытый, для проверки подписи. Смотрите на java.security.Signature. Подпись может храниться в том же файла, что и тест.
(Anonymous)
Aug. 31st, 2010 05:10 am (UTC)
Re: Хранение базы данных на диске
Евгений, а разбор темы, в каком виде сохранять информацию (когда в базе данных, когда в XML, когда сериализацией), может быть темой для отдельной статьи?
skipy_ru
Aug. 31st, 2010 07:03 am (UTC)
Re: Хранение базы данных на диске
Алексей, это в достаточной степени технический вопрос. Я могу объяснить, почему ответил именно так.

В обычном случае я бы посоветовал, естественно, хранить все в базе. Тоже с подписью, с зашифрованными вариантами ответов. Однако Вы сказали, что с базой у Вас проблемы. Ок.

Дальше, можно использовать сериализацию. Но, судя по всему, у Вас структура не устоялась. Хотя это будет проблемой исключительно на этапе разработки, дальше, когда приложение будет готово - вряд ли Вы будете так уж часто менять структуру данных. Это, возможно, вариант.

Кстати, при использовании Externalizable Вы можете следить за версиями и каждую читать соответственно, главное - версию записывать в поток первой. Мы так когда-то делали, у нас был свой аналог Externalizable, так временами мы читали более 20 версий одного класса. Когда их накапливалось чересчур много - проводили конверсию. Читали всё, что есть, в разных версиях, а писали, естественно, в последней. Код, читающий предыдущие версии, вырезался. Это, возможно, тоже вариант.

Про XML я сказал почти что на автомате - я в последнее время только в нем и храню данные. И это был бы хороший вариант. Однако сейчас я подумал вот о чем - вопросы ведь тоже не должны быть видны до теста. Их и править нельзя, и смотреть, иначе какой же это тест? Т.е. XML тут, по-хорошему, не нужен, он хорош тогда, когда надо иметь возможность данные руками править. Судя по всему - не ваш вариант.

Я думаю, что в Вашем случае будет достаточно обычной сериализации с использованием Externalizable, если Вам действительно нужен контроль версий (подозреваю, что не нужен, тогда и Serializable использовать можно).

Ну а если уж совсем размахнуться... :) Сериализация при помощи Externalizable, с самостоятельным контролем версий. Полученный поток шифруется закрытым ключом, потом дополнительно изменяется - как-то переставляются байты, например. Это чтобы затруднить дешифрование. Причем алгоритм кодирования должен при каждой сборке меняться, например, зависеть от контрольной суммы байткода нескольких классов. Дальше всё это сжимается потоковым GZIP-ом и кладется в подписанный jar, что исключает возможность подмены файла с данными. Распаковка в обратную сторону - проверяется подпись, распаковывается потоковый GZIP, декодирование, дешиврование открытым ключом, десериализация. Это, конечно, тоже можно поломать, но придется попотеть. :)
(Anonymous)
Sep. 2nd, 2010 10:52 am (UTC)
Re: Хранение базы данных на диске
Ух! :) Такое шифрование для меня пока слишком круто. Пожалуй, остановлюсь на варианте стандартной сериализации. Программа будет использоваться в пределах нашей организации и, думаю, "ломать" ее не будут и выгоды от этого тоже никто не получит. Спасибо, что пояснили! Теперь могу ориентироваться, где какую технологию стоит применять.

Евгений, у меня есть другой вопрос. Тоже очень актуальный сейчас.
Какие знания нужно развивать в первую очередь, чтобы как можно быстрее устроиться на вакансию "Java-программист"? SQL, XML, базы данных, севрлеты, столько всего!!! А также сам язык Java включает много разделов (чего стоят только web-технологии!).
По моему небольшому исследованию, в вакансиях чаще всего встречаются требования: SE, EE, сервлеты, SQL, JSP, XML, фреймворки, базы данных.
Читал в Вашей биографии, что Вам приходилось заниматься наймом программистов.
У меня есть резюме на headhunter'е: http://spb.hh.ru/resume/800ce3d7ff00a704b9cdf422ec
Буду очень благодарен, если Вы найдете время прочесть его и подсказать, в каком направлении развивать свои знания в программировании!

PS Кстати, есть интересные обзоры з/п java-программистов от мая 2010 и 2008 годов.
http://www.superjob.ua/research/articles/50347/programmist-java/
http://www.superjob.ru/research/articles/850/programmist-java/
(Anonymous)
Oct. 12th, 2010 04:26 pm (UTC)
Re: Хранение базы данных на диске
Евгений, большое спасибо за советы! Сегодня испробовали приложение - работает!! :)))

Однако, возникла проблема с защитой исходного кода: провел обфускацию (в ProGuard'e) и десериализация теперь выдает ClassNotFoundException. Это из-за обфускации или могут быть другие причины? (Заменяю "обфускованный")) файл на оригинальный - все работает, как положено).
skipy_ru
Oct. 12th, 2010 07:09 pm (UTC)
Re: Хранение базы данных на диске
Зависит от. Если с обфускированными классами работает сериализация, а потом десериализация, но не работает десериализация ранее сериализованного объекта - естественно, дело в обфускации. Точнее, в изменении имен. При сериализации в поток кроме имен классов пишутся и имена полей классов, чтобы иметь возможность восстанавливать данные при изменившемся порядке полей, например. Скорее всего обфускатор эти имена меняет. При использовании Externalizable такой проблемы возникнуть не должно - в поток пишутся только данные.

Так что если работает полный цикл - сначала сериализация, потом десериализация - можете не обращать внимания на эту ошибку. Она временная, связанная с изменением имен. Если же имена будут изменяться и в проышленном режиме - например, обфускатор каждый раз по-другому будет поля обзывать - имеет смысл посмотреть на Externalizable.