|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
28.10.2009, 11:04 | #1 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
Сериализуемый Singletone
Я делал механизм сохранения настроек программы (C#). Как только я познакомился с механизмом Settings.settings, я сразу от него отказался (см. другой топик). :)
Первый очевидный вариант - сделать статический класс с переменными настроек. Но я собирался использовать сериализацию в XML файл, а статические объекты не сериализуются. Поэтому мне пришлось изучить шаблоны проектирования (паттерны), в частности, синглтон (одиночка). Подробнее про шаблоны в другом топике. Как оказалось, то ли у сериализатора проблемы с наследованием (см здесь), то ли проблема в самом синглтоне. В общем, мне пришлось спроектировать свой класс - сериализуемый аналог синглтона. Вот что получилось. Код:
Последний раз редактировалось ds.Dante; 28.10.2009 в 11:17. |
28.10.2009, 11:19 | #2 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
Ну вообще-то не очень. Загрузки нету. Я бы сделал так(точнее делаю):
Код:
|
28.10.2009, 12:22 | #3 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
Несколько вопросов.
1) Код:
2) Чем отличается [NonSerialized] и [XmlIgnore]? Где можно посмотреть все эти атрибуты? Необходимы ли они здесь для статических членов, или это для наглядности? 3) Почему именно здесь нужен lock(instanceSync)? Почему не нужен в других местах? 4) Как я понял, в программе нужно создавать глобальный экземпляр класса Options? |
28.10.2009, 13:34 | #4 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
1. Просто стиль
2. Разница между ними заключается в используемых сериализаторах/форматерах. Это кусок рабочей программы, немного переделанный под твой случай и где в моем коде используются форматеры. Есть SoapFormatter и BinaryFormatter, для них нудо использовать [NonSerialized]. Для XmlSerializer - [XmlIgnore]. Дело в то, что XmlSerializer сам игнорирует не public поля. А SoapFormatter и BinaryFormatter не делает этого. Почитать можно тут http://kaushalp.blogspot.com/2005/06...rformance.html. 3. Ты работаешь со статических объектом, поэтому нужна синхронизация. Т.е. может возникнуть ситуация, когда ты изменяешь данный объект одновременно из двух мест. 4. Нет. В программе ты пользуешься точно также как в твоем примере. Единственное, что при первом обращении произойдет загрузка(если есть файл) настроек. |
28.10.2009, 16:11 | #5 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
Спасибо за ответ. Пункт 2 буду переваривать несколько дней. :)
|
11.01.2010, 11:32 | #6 |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
Сегодня вернулся с "отпуска". :)
В выходные решил поднять старую тему, и с новыми знаниями (я на шарпе всего несколько месяцев программирую) ещё раз попробовать сделать класс настроек. В общем, статический класс ничем не хуже синглтона, скорее даже это встроенный в язык синглтон. Непосредственно значения настроек проще всего хранить в отдельной структуре (OptionsValues), во-первых, чтобы не использовать аттрибуты NonSerialized, а во-вторых, из-за невозможности сериализовать статические типы. К тому же в этой структуре можно хранить значения настроек по умолчанию (DefaultOptions) и максимальные допустимые значения (MaximumOptions). Также в проекте есть форма окна с настройками OptionsForm, экземпляр которой содержится в классе. Я так сделал, потому что я планирую использовать этот класс в плагинах, и набор параметров заранее будет неизвестен. В конце прикреплён весь проект с формой OptionsForm и с демонстрацией работы класса. Код:
Последний раз редактировалось ds.Dante; 12.01.2010 в 10:51. |
11.01.2010, 15:08 | #7 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
Выскажу свое мнение.
1. У тебя класс, который загружает данные при каждом обращении. У тебя пример простой, ты считываешь мало данных, а в реальной жизни это может быть и 20 мб и представь ситуацию: Код:
2. Поскольку ты объявил все переменные как static то нету смысла вообще создавать этот класс. Т.к. получается, что у тебя обычные статические переменные, которым присвоили значения. Они просто собраны в одном классе. 3. Работа с формой из static класса - совсем плохо. Вообще советуют не использовать статические переменные. Исключение составляет синглтон с настройками. И когда подписываешься на событие (у тебя Form_Closing) не забывай отписаться. |
11.01.2010, 15:40 | #8 | ||
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
Не понял. Настройки читаются только в Read(), а обращение к ним через Options.Current.
Цитата:
Цитата:
А зачем отписываться? |
||
11.01.2010, 17:30 | #9 |
Участник клуба
Регистрация: 03.05.2007
Сообщений: 1,189
|
1. Сорри, не заметил, просто тебе нужно дополнительно вызывать команду Load(чего не надо в сингтоне).
2. Это не совсем синглтон. Пример синглтона есть выше. 3. Тут описаны советы, в них подводные камни http://msdn.microsoft.com/ru-ru/library/dd335949.aspx 4. Отписываться от подписанных событий необходимо всегда. Если не отписываться, то у твоего объекта, который подписался будет висеть ссылка на событие, что не позволит GC(сборщику мусора) очистить память. |
12.01.2010, 10:50 | #10 | |
Старожил
Регистрация: 06.08.2009
Сообщений: 2,992
|
1) Немного изменил конструктор (отредактировал пост):
Код:
2) Тем не менее, существование статического класса кажется мне вполне обоснованным. 3) Не нашёл в статье чего-то применительного к моим формам (хотя с многопоточностью у меня, конечно, проблемы). Ты имел в виду, что в статическом классе я не смогу отписаться от события? 4) Кстати, о стиле. Цитата:
Последний раз редактировалось ds.Dante; 12.01.2010 в 10:55. |
|