powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сериализация
25 сообщений из 32, страница 1 из 2
Сериализация
    #38238553
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как сериализовать статический класс (если вообще возможно)?
Статический класс представляет собой настройки приложения. Значения его полей должны быть доступны в любом месте приложения без создания объекта класса. Я понимаю, что сериализуется именно объект, а не сам класс. Но как-то же идет сериализация настроек Properties.Settings.Default в C# и My.Settings в VB... Я попытался разобраться в классе Properties.Settings.Default - но не осилил.

"Пока что сериализую настройки так:"
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
public class Settings
	{
		private static TabAlignment _TabsPosition;
		private static FormWindowState _AppState;
		private static Boolean _AutoStart;
		private static Boolean _HistorySave;
		private static String _HistorySize;
		private static String _Blink;
		private static Boolean _CloseDbl;
		private static Boolean _MinimizeOnClose;
		private static Settings _Setting;

		static Settings() {
		_TabsPosition = TabAlignment.Top;
		_AppState = FormWindowState.Normal;
		_AutoStart = true;
		_HistorySave = true;
		_HistorySize = "100";
		_Blink = "5";
		_CloseDbl = true;
		_MinimizeOnClose = true;
		_Setting = new Settings();
		}

	#region "properties"
		public  TabAlignment TabsPosition {
			get { return _TabsPosition; }
			set { _TabsPosition = value; }
			
		}

		public  FormWindowState AppState {
			get { return _AppState; }
			set { _AppState = value; }
		}

		public  Boolean AutoStart {
			get { return _AutoStart; }
			set { _AutoStart = value; }
		}

		public  Boolean HistorySave {
			get { return _HistorySave; }
			set { _HistorySave = value; }
		}

		
		public  String HistorySize {
			get { return _HistorySize; }
			set { _HistorySize = value; }
		}

		public  String Blink {
			get { return _Blink; }
			set { _Blink = value; }
		}

		
		public  Boolean CloseDbl {
			get { return _CloseDbl; }
			set { _CloseDbl = value; }
		}
		
		public  Boolean MinimizeOnClose {
			get { return _MinimizeOnClose; }
			set { _MinimizeOnClose = value; }
		}

		/// <summary>
		/// Сохранение настроек
		/// </summary>
		public static void Serialize(){
			Stream SerializedLst = File.Create("Settings.xml");
			XmlSerializer serializer = new XmlSerializer(typeof(Settings));
			serializer.Serialize(SerializedLst, _Setting);
			SerializedLst.Close();
		}

		/// <summary>
		/// Загрузка настроек
		/// </summary>
		public static void Deserialize() {
			if(File.Exists("Contacts.xml")) {
				Stream Serialized = File.OpenRead("Settings.xml");
				XmlSerializer deserializer = new XmlSerializer(typeof(Settings));
				_Setting = (Settings)deserializer.Deserialize(Serialized);
				Serialized.Close();
			}
		}
	#endregion
	}


Сериализация:
Код: c#
1.
Settings.Serialize();


Но обратится напрямую к свойствам без создания объекта уже нельзя =(
Код: c#
1.
Settings.TabsPosition //не конает


Если свойствам назначить модификатор static. обращаться без объекта можно, но эти свойства не сериализуются.
Если объявить класс как static, то десериализация не получается - нельзя конвертнуть к статическому типу.
Подскажите хотя бы в каком направлении копать.
...
Рейтинг: 0 / 0
Сериализация
    #38238584
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollКак сериализовать статический класс (если вообще возможно)?
Никак. Только обходными путями, типа рефлексией собрать свойства и их значения и сериализовать object[,], потом распрасить обратно. Но всё это от лукавого.
...
Рейтинг: 0 / 0
Сериализация
    #38238602
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нашел было упоминание, что может помочь DataTable + Base64, но так и не понял, как.
...
Рейтинг: 0 / 0
Сериализация
    #38238607
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Способов много, но все они через зад. Статика зло, перепиши на нормальный класс и больше так не делай.
...
Рейтинг: 0 / 0
Сериализация
    #38238622
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я бы с радостью не использовал статические данные. Но я понятия не имею. как еще можно реализовать поставленную задачу... Разве что при каждом обращении к настройке каждый раз считывать ее значение с файла. Но здесь много лишних телодвижений, как мне кажется.
...
Рейтинг: 0 / 0
Сериализация
    #38238634
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollДа я бы с радостью не использовал статические данные. Но я понятия не имею. как еще можно реализовать поставленную задачу... Разве что при каждом обращении к настройке каждый раз считывать ее значение с файла. Но здесь много лишних телодвижений, как мне кажется.
А в чем проблема?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Settings
{
    public bool AutoStart { get; set; }
    public bool HistorySave { get; set; }
    public string Blink { get; set; }

    public static Settings Read()
    {
        return new Settings 
        { 
            AutoStart = true,
            HistorySave = false,
            Blink = "блин",
        };
    }
}
...
Рейтинг: 0 / 0
Сериализация
    #38238646
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот блин. Я чет не допер. Настроился на нечто сложное и не вразумительное.

Спасибо!
...
Рейтинг: 0 / 0
Сериализация
    #38239082
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рано радовался =(
cooldeveloper
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Settings
{
    public bool AutoStart { get; set; }
    public bool HistorySave { get; set; }
    public string Blink { get; set; }

    public static Settings Read()
    {
        return new Settings 
        { 
            AutoStart = true,
            HistorySave = false,
            Blink = "блин",
        };
    }
}


Таким способом настройки никуда не сохраняются без объекта и без статических переменных.
То есть,
Код: c#
1.
2.
Settings.Read().AutoStart = false;
Boolean bl = Settings.Read().AutoStart; //даст все равно true
...
Рейтинг: 0 / 0
Сериализация
    #38239109
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагается, что возвращаются значения из хранилища настроек, а не константы, забитые в исходник.
...
Рейтинг: 0 / 0
Сериализация
    #38239136
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollТаким способом настройки никуда не сохраняются без объекта и без статических переменных.
То есть,
Код: c#
1.
2.
Settings.Read().AutoStart = false;
Boolean bl = Settings.Read().AutoStart; //даст все равно true


Садись, двойка. Это 2 абсолютно разных объекта.

Код: c#
1.
2.
3.
4.
var obj = Settings.Read();
bool bl = obj.AutoStart; // true
obj.AutoStart = false;
bl = obj.AutoStart; // false



Срочно учить матчасть.
...
Рейтинг: 0 / 0
Сериализация
    #38239147
JohnSparrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Топикстартер, прочитай про шаблон singleton.
...
Рейтинг: 0 / 0
Сериализация
    #38239271
Фотография Denis.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloperNickopollДа я бы с радостью не использовал статические данные. Но я понятия не имею. как еще можно реализовать поставленную задачу... Разве что при каждом обращении к настройке каждый раз считывать ее значение с файла. Но здесь много лишних телодвижений, как мне кажется.
А в чем проблема?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class Settings
{
    public bool AutoStart { get; set; }
    public bool HistorySave { get; set; }
    public string Blink { get; set; }

    public static Settings Read()
    {
        return new Settings 
        { 
            AutoStart = true,
            HistorySave = false,
            Blink = "блин",
        };
    }
}


wtf?
видимо и впрямь не муся
...
Рейтинг: 0 / 0
Сериализация
    #38239418
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cooldeveloperNickopollТаким способом настройки никуда не сохраняются без объекта и без статических переменных.
То есть,
Код: c#
1.
2.
Settings.Read().AutoStart = false;
Boolean bl = Settings.Read().AutoStart; //даст все равно true


Садись, двойка. Это 2 абсолютно разных объекта.

Я понимаю, что это разные объекты. потому и говорю, что не подходит способ.
cooldeveloper
Код: c#
1.
2.
3.
4.
var obj = Settings.Read();
bool bl = obj.AutoStart; // true
obj.AutoStart = false;
bl = obj.AutoStart; // false


Опять же создание объекта...

JohnSparrow Топикстартер, прочитай про шаблон singleton.
Да, я в немного знаю о синглтоне, но поначалу сомневался. что он мне поможет. Все же пораскинул чуть мозгой - и проблему решил именно синглтоном.
Всем спасибо.
...
Рейтинг: 0 / 0
Сериализация
    #38239490
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollЯ понимаю, что это разные объекты. потому и говорю, что не подходит способ.
Не понял, чем не подходит?

NickopollОпять же создание объекта...
Представь себе, всё в дотнете устроено на созданиях объектах

P.S. В чем сложности-то?
...
Рейтинг: 0 / 0
Сериализация
    #38239552
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Представь, я понимаю, что все завязано на объекта, и, как мне кажется, не только в дотнете...

А не подходит тем, что в твоем варианте необходимо создание объекта класса Settings каждый раз, когда необходимо считать/записать какую-либо настройку. Мне же нужно, чтобы существовал максимум один объект на все приложение, был доступен в любом месте и был единожды инициализирован. Потому я ничего лучшего, чем синглетон, не придумал.
Вот, что я получил
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
	public class Settings
	{
		private static Settings _Instance;

		public TabAlignment TabsPosition { get; set; }
		public FormWindowState AppState { get; set; }
		public Boolean AutoStart { get; set; }
		public Boolean HistorySave { get; set; }
		public String HistorySize { get; set; }
		public String Blink { get; set; }
		public Boolean CloseDbl { get; set; }
		public Boolean MinimizeOnClose { get; set; }

		public static Settings Setting {
			get {
 				if (_Instance == null){
					_Instance = new Settings {
						TabsPosition = TabAlignment.Top,
						AppState = FormWindowState.Normal,
						AutoStart = true,
						HistorySave = true,
						HistorySize = "100",
						Blink = "5",
						CloseDbl = true,
						MinimizeOnClose = true
					};
 				}
				return _Instance;
			}
			set {
				if (_Instance == null){
					_Instance = new Settings {
						TabsPosition = value.TabsPosition,
						AppState = value.AppState,
						AutoStart = value.AutoStart,
						HistorySave = value.HistorySave,
						HistorySize = value.HistorySize,
						Blink = value.Blink,
						CloseDbl = value.CloseDbl,
						MinimizeOnClose = value.MinimizeOnClose
					};
				} else {
					_Instance.TabsPosition = value.TabsPosition;
					_Instance.AppState = value.AppState;
					_Instance.AutoStart = value.AutoStart;
					_Instance.HistorySave = value.HistorySave;
					_Instance.HistorySize = value.HistorySize;
					_Instance.Blink = value.Blink;
					_Instance.CloseDbl = value.CloseDbl;
					_Instance.MinimizeOnClose = value.MinimizeOnClose;
				}				
			}
		}

		public static void Serialize() {
			Stream SerializedLst = File.Create("Settings.xml");
			XmlSerializer serializer = new XmlSerializer(typeof(Settings));
			serializer.Serialize(SerializedLst, Settings.Setting);
			SerializedLst.Close();
		}
	}


Использование:
Код: c#
1.
2.
Settings.Setting.AutoStart = false;
Boolean bl = Settings.Setting.AutoStart;//false


Вот этого я и добивался.
...
Рейтинг: 0 / 0
Сериализация
    #38239560
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollА не подходит тем, что в твоем варианте необходимо создание объекта класса Settings каждый раз, когда необходимо считать/записать какую-либо настройку.
Ну так кешируй, если нужно считать только один раз. Причем тут сам класс? Класс описал, а инструмент, который с ним работает, кеширует, сериализует и т.д. - это уже другая композиция. Учи матчасть что-ле.
...
Рейтинг: 0 / 0
Сериализация
    #38239569
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А надо было написать пару строк кода-то...

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
public class Settings
{
    public bool AutoStart { get; set; }
    public bool HistorySave { get; set; }
    public string Blink { get; set; }

    private static Settings _cahce;
    public static Settings Read()
    {
        if (_cahce == null)
        {
            _cahce = new Settings
            {
                AutoStart = true,
                HistorySave = false,
                Blink = "блин",
            };
        }

        return _cahce;
    }

    public static void Flush()
    {
        _cahce = null;
    }
}



P.S. Но, вообще, все эти синглтоны - зло. Класс - для описания , логика работы (вычитывание из конфига, кеширование и т.д.) - другой независимый класс .
...
Рейтинг: 0 / 0
Сериализация
    #38239604
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cooldeveloper логика работы (вычитывание из конфига, кеширование и т.д.) - другой независимый класс
Вот тут недопонял.
Имеется ввиду, абстрактные классы и реализация их методов в дочерних?
...
Рейтинг: 0 / 0
Сериализация
    #38239632
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nickopollcooldeveloper логика работы (вычитывание из конфига, кеширование и т.д.) - другой независимый класс
Вот тут недопонял.
Имеется ввиду, абстрактные классы и реализация их методов в дочерних?

Код: c#
1.
2.
3.
4.
5.
6.
7.
// Описание настроек
public class Store
{
    public bool AutoStart { get; set; }
    public bool HistorySave { get; set; }
    public string Blink { get; set; }
}




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// Класс для работы с конфигом
public class Settings
{
    private static Store _cahce;
    public static Store Read()
    {
        if (_cahce == null)
        {
            _cahce = new Store
            {
                AutoStart = true,
                HistorySave = false,
                Blink = "блин",
            };
        }

        return _cahce;
    }

    public static void Flush()
    {
        _cahce = null;
    }
}



Ты получаешь и сериализацию, и отдельную независимую логику чтения настроек. Нужно будет что-то еще, напишешь еще отдельный класс, который может работать с Store. Ну что непонятно-то?
...
Рейтинг: 0 / 0
Сериализация
    #38239646
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cooldeveloperПредставь себе, всё в дотнете устроено на созданиях объектах

Код: c#
1.
var res = Math.Sin(Math.Pow(Math.PI, Math.E));


Это тоже?
...
Рейтинг: 0 / 0
Сериализация
    #38239676
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дык, а мне и не нужно в данном приложении разбивать один класс на два. Это не какой-то архипорект и подобные действия не целесообразны в данном случае.
...
Рейтинг: 0 / 0
Сериализация
    #38239682
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВcooldeveloperПредставь себе, всё в дотнете устроено на созданиях объектах

Код: c#
1.
var res = Math.Sin(Math.Pow(Math.PI, Math.E));


Это тоже?

Да.
...
Рейтинг: 0 / 0
Сериализация
    #38239689
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollДык, а мне и не нужно в данном приложении разбивать один класс на два. Это не какой-то архипорект и подобные действия не целесообразны в данном случае.
Декомпозиция целесообразна всегда вне зависимости от масштаба проекта. Пихать всё в единственный класс карается законом о гавнокоде.
...
Рейтинг: 0 / 0
Сериализация
    #38239699
Nickopoll
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cooldeveloperNickopollДык, а мне и не нужно в данном приложении разбивать один класс на два. Это не какой-то архипорект и подобные действия не целесообразны в данном случае.
Декомпозиция целесообразна всегда вне зависимости от масштаба проекта. Пихать всё в единственный класс карается законом о гавнокоде.
Исходя из твоей логики, целесообразно каждую переменную распихать по отдельным классам и это говнокодом считаться не будет...
...
Рейтинг: 0 / 0
Сериализация
    #38239714
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NickopollИсходя из твоей логики, целесообразно каждую переменную распихать по отдельным классам и это говнокодом считаться не будет...
Не вижу корреляции между декомпозицией задач описания и задач логики. Шагом марш читать Application Architecture Guide от MS. Глава Объектно-ориентированная архитектура, она тебе расскажет, что такое абстракция, композиция, наследование, инкапсуляция, полиморфизм и отделение. Там же ты узнаешь, что такое понятность, возможность повторного использования, тестируемость, расширяемость и высокая связность.
А пока присаживайся, двойка.
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Сериализация
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]