Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Сериализация статического класса


Автор: V0fka 21.8.2013, 14:32
Привет!

Есть статический класс.

Код

internal static class UserSetting
    {
        public static WF.OpenFileDialog openFileDialog;
        public static WF.FolderBrowserDialog folderBrowserDialog;

        static void Save()
        {
            XmlSerializer mySerializer = new XmlSerializer(typeof(UserSetting));
            StreamWriter writer = new StreamWriter("Settings.xml");
            mySerializer.Serialize(writer, this); // тут ошибка
            writer.Close();
        }
    }


И несколько вопросов:
1) в строке, которую я выделил коментом пяовляется ошибка, что писать this нельзя. Есть ли какой-то аналог this-а в статическом классе, т.е. ссылка на сам себя? Или это никому нигде не надо и все пользуются ИмяКласса.ИмяЧлена ?
2) Пробовал вместо this писать UserSetting. Но студия говорит, что UserSetting не является объектом. Я понимаю о чем оно говорит. Можно как-то выйти из положения имея именно статический класс?
3) Имеет ли смысл в статическом классе иметь не статические члены?

Автор: diadiavova 21.8.2013, 14:53
Во-первых, классы не сериализуются вообще. Сериализуются объекты, объекты являются экземплярами классов, а у статических классов экземпляров не бывает.
Во-вторых, this - не просто ссылка на себя, а ссылка на текущий экземпляр, а у статических классов... ну ты понял smile 

Автор: V0fka 21.8.2013, 15:01
В пхп можно обратиться к текущему экземпляру статического класса из самого себя использую ключевое слово self. Думал, может в шарпе что-то такое тоже есть smile . В общем получается, то что я хочу сделать - через статический класс не делается, т.е. надо сделать класс нестатический, создавать его экземпляр и сериализовать, я правильно понял? smile

И если не сложно, на 3-й вопросик бы получить ответ. smile

Автор: diadiavova 21.8.2013, 15:29
Цитата(V0fka @  21.8.2013,  16:01 Найти цитируемый пост)
В пхп можно обратиться к текущему экземпляру статического класса

Видимо в пхп само понятие статического класса другое. Мне в принципе непонятно почему класс статический, если у него могут быть экземпляры. Если ты объяснишь мотив, по которому решил сделать класс статическим, то может и можно будет что-то придумать.
Цитата(V0fka @  21.8.2013,  16:01 Найти цитируемый пост)
И если не сложно, на 3-й вопросик бы получить ответ.

Нестатические члены могут быть только у экземпляра, а статическй класс ... smile 

Автор: V0fka 21.8.2013, 17:43
Цитата(diadiavova @  21.8.2013,  15:29 Найти цитируемый пост)
Если ты объяснишь мотив, по которому решил сделать класс статическим, то может и можно будет что-то придумать.

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

Цитата(diadiavova @  21.8.2013,  15:29 Найти цитируемый пост)
Нестатические члены могут быть только у экземпляра, а статическй класс ...

Например, вот так, студия не ругается:

Код

public static class TestClass
    {
        public string test;
    }


Но при попытке обратиться к TestClass.test говорит, что для нестатического своства нужен экземпляр. Те знания, которыми обладаю я, дают мне понять, что к test обратиться невозможно никак и неоткуда. И вопрос состоит в том, что на самом ли деле так, либо я чего-то не знаю? smile 

Автор: diadiavova 21.8.2013, 23:24
Цитата(V0fka @  21.8.2013,  18:43 Найти цитируемый пост)
Как видно по названию, это пользовательские настройки.

Чем не устраивают стандартные параметры приложения?
http://msdn.microsoft.com/ru-ru/library/bb397750.aspx
http://msdn.microsoft.com/ru-ru/library/a65txexh.aspx

Цитата(V0fka @  21.8.2013,  18:43 Найти цитируемый пост)
Создавать экземпляры необходимости нету и отовсюду в программе нужно иметь доступ к единственному экземпляру настроек. Поэтому я решил, что это будет статический класс.

Тебе нужен не статический класс, а статическое свойство, возвращающее единственный экземпляр класса. Гугли https://www.google.ru/search?q=singletone&ie=utf-8&oe=utf-8&rls=org.mozilla:ru:official&client=firefox-a&channel=rcs&gws_rd=cr#channel=rcs&fp=4823ff53236cf946&newwindow=1&q=singleton&rls=org.mozilla:ru:official&spell=1.
Цитата(V0fka @  21.8.2013,  18:43 Найти цитируемый пост)
Например, вот так, студия не ругается:

Я именно об этом и написал. У статического класса могут быть только статические члены, поскольку нестатические члены являются членами экземпляра, которых у статического класса просто не может быть.
Цитата(V0fka @  21.8.2013,  18:43 Найти цитируемый пост)
 И вопрос состоит в том, что на самом ли деле так, либо я чего-то не знаю? 

На самом деле так и я уже несколько раз об этом сказал.

Автор: V0fka 22.8.2013, 09:34
Цитата(diadiavova @  21.8.2013,  23:24 Найти цитируемый пост)
Чем не устраивают стандартные параметры приложения?

http://forum.vingrad.ru/forum/topic-371343.html

Цитата(diadiavova @  21.8.2013,  23:24 Найти цитируемый пост)
Тебе нужен не статический класс, а статическое свойство, возвращающее единственный экземпляр класса. Гугли singleton.

Что такое singleton я знаю, но почему-то думал, что для этих целей именно статический класс лучше подойдет.


Цитата(diadiavova @  21.8.2013,  23:24 Найти цитируемый пост)
Я именно об этом и написал. У статического класса могут быть только статические члены, поскольку нестатические члены являются членами экземпляра, которых у статического класса просто не может быть.

Цитата(diadiavova @  21.8.2013,  23:24 Найти цитируемый пост)
На самом деле так и я уже несколько раз об этом сказал.

Я может дотошный немного, но хотел для себя уяснить все однозначно smile . Спасибо тебе большое за ликбез! smile 

Автор: diadiavova 22.8.2013, 10:47
Цитата(V0fka @  22.8.2013,  10:34 Найти цитируемый пост)
Вот этим

А почему ты ищешь сохранённые парамеиры в файле конфигурации? Они сохраняются в специальных файлах .settings и находятся где-то в папке аппдата. Нужно смотреть, восстановились они или нет, а не искать в файле. Что до сохранения простых и сложных настроек, то типы, сохраняемые в настройках, должны быть сериализуемыми, деталей не помню, но всё есть в документации по параметрам. Например эту статью неплохо бы прочитать
http://msdn.microsoft.com/ru-ru/library/8eyb2ct1.aspx
да и вообще связанные топики
Цитата

Если поставщику LocalFileSettingsProvider требуется сохранить параметры на диск, он выполняет перечисленные ниже действия.


Использует отражение для проверки всех свойств, определенных для производного от ApplicationSettingsBase класса, выявляя свойства, примененные с атрибутами ApplicationScopedSettingAttribute и UserScopedSettingAttribute. 


Сериализует свойство на диск. Сначала пытается вызвать метод ConvertToString или ConvertFromString связанного с типом класса TypeConverter. Если это не удается, использует XML-сериализацию. 


Распределяет параметры по файлам на основании атрибута параметра.

Автор: V0fka 23.8.2013, 09:05
diadiavova, спасибо! Во-первых, я действительно не там искал настройки. А во-вторых, они должны были загружаться в программу, но не загружались почему-то. Но в форме, в которой я это делал, и настройки не работали и привязки. Сделал новую форму с тем же функционалом и случилось чудо smile . Почему оно не работало ранее - для меня останется загадкой. Ещё раз спасибо большое за помощь! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)