Предисловие
В связи с прогрессирующей тенденцией написания бесполезных или просто неправильных гайдов я решил написать свою статью, как говорится с покером и куртизанками.
Подмечу сразу, это не гайд, это статья повествующая о различных методах создания конфигов, то есть предназначена она для людей хотя бы немного смыслящих в том, что они делают.
Вступление
Можно отметить несколько основных способов создания конфигов.
1. Использование конфигурационного файла проекта. Чтение из такого конфига производится по пути
Properties.Settings.Default.<Имя_ключа>
Данный вариант не сложный и не требует объяснений.
2. Использование WinAPI, в данном случае создается обычный *.ini файл вида
Код:
[СЕКЦИЯ]
Ключ=значение
Как это реализуется я опишу позже.
3. Сериализация. Сразу отмечу 2 типа сериализации бинарную и XML сериализации
3.1 XML сериализация. Как и в первом способе создается XML файл но с небольшим отличием, здесь мы делаем все вручную. XML файл можно прочитать любым текстовым редактором.
3.2 Бинарная сериализация более продвинута в плане скорости и защищенности, полученный файл можно прочитать используя только вашу программу.
Следует отметить, что сериализация используется не только для хранения но и для передачи данных, например можно передать сериализированный класс по протоколу TCP/IP, а на другом конце "провода" десериализировать обратно. Вобщем тема довольно обширная, я не буду затрагивать все ее аспекты, только основы.
4. Практика.
Нам потребуются слудующие пространства имен
Код:
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml.Serialization;
WinAPI
Начнем с самого простого примера, с использования
WinAPI.
Для записи в конфиг в API есть метод
Код:
WritePrivateProfileString(string section, string key, string val, string filePath)
параметры: section - имя секции(то что будет в квадратных скобках)
key - имя ключа(то что перед знаком равенства)
val - значение(то что после знакак равенства)
filePath - путь к файлу
Для чтения
Код:
GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath)
параметры аналогичные, но появились новые
def - имя ключа принимаемое по умолчанию(если key не найдено)
retVal - буфер символов, в него будет производится запись
size - размер буфера
Код
Код:
class Config
{
[DllImport("kernel32")]
private static extern long WritePrivateProfileString(string section,
string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section,
string key, string def, StringBuilder retVal,
int size, string filePath);
public string Path { get; set; }
public Config(string filepath)
{
Path = filepath;
}
public void Write(string Section, string Key, string Value)
{
WritePrivateProfileString(Section, Key, Value, this.Path);
}
public string Read(string Section, string Key)
{
var temp = new StringBuilder(255);
GetPrivateProfileString(Section, Key, "", temp, 255, this.Path);
return temp.ToString();
}
}
Пример использования
Код:
private Config cfg; //создаем поле класса
******
cfg = new Config(Application.StartupPath + @"\config.ini"); //инициализируем поле используя абсолютный путь к файлу
cfg.Write("User", "Username", textBox1.Text); //Запись в конфиг
**********
string someText = cfg.Read("User", "Username"); //Чтение значения ключа Username
XML сериализация
Отсюда начинается самое интересное. В таком файле можно хранить не только числа или строки, здесь можно записывать и затем читать экземпляры классов, списки в общем все что душа пожелает.
Давайте для примера напишем свой класс, у меня он будет называтся
Window, он будет иметь 3 свойста.
Первое - координата X
Второе - координата Y
Третье - размер окна
Код
Код:
public class Window
{
public int X
{ get; set; }
public int Y
{ get; set; }
public Size Size
{ get; set; }
}
Давайте теперь напишеем метод записи в наш конфиг
Код
Код:
static public void Save(Window window)
{
XmlSerializer serializer = new XmlSerializer(typeof(Window));
TextWriter textWriter = new StreamWriter(@"cfg.xml");
serializer.Serialize(textWriter, window);
textWriter.Close();
}
используем так
Код:
Window win = new Window();
win.X = this.Left;
win.Y = this.Top;
win.Size = this.Size;
Save(win);
или анонимно, так
Код:
Save(new Window { X = this.Left, Y = this.Top, Size = this.Size });
Таак, с записью мы разобрались, давайте попробуем прочитать данные из полученного файла
Код
Код:
static Window Read(string filePath)
{
XmlSerializer deserializer = new XmlSerializer(typeof(Window));
TextReader textReader = new StreamReader(filePath);
Window cfg = (Window)deserializer.Deserialize(textReader);
textReader.Close();
return cfg;
}
используем так
Код:
Window win = Read("cfg.xml");
this.Left = win.X;
this.Top = win.Y;
this.Size = win.Size;
Таким образом мы сохранили координаты нашего окна, а затем востановили их из файла.
Бинарная сериализация
В данном примере я буду использовать все тот же класс Window, и так начнем.
Добовляем нашему классу атрибут [Serializable()]. Атрибут Serializable сообщает компилятору, что все находящееся в классе может быть сохранено в файле.
Вот так будет выглядеть наш класс
Код
Код:
[Serializable()]
public class Window
{
public int X
{ get; set; }
public int Y
{ get; set; }
public Size Size
{ get; set; }
}
Теперь давайте попробуем сериализировать экземпляр класса
Код
Код:
static void Serialize(Window window)
{
Stream TestFileStream = File.Create("cfg.bin");
BinaryFormatter serializer = new BinaryFormatter();
serializer.Serialize(TestFileStream, window);
TestFileStream.Close();
}
используем так
Serialize(new Window { X = this.Left, Y = this.Top, Size = this.Size });
Ну вот, с сериализацией мы кое как справились, давайте пробовать десериализацию
Код
Код:
static Window Deserialize(string filePath)
{
Stream FileStream = File.OpenRead(filePath);
BinaryFormatter deserializer = new BinaryFormatter();
Window win = (Window)deserializer.Deserialize(FileStream);
FileStream.Close();
return win;
}
ну и соответственно используем так
Код:
Window win = Deserialize("cfg.bin");
this.Left = win.X;
this.Top = win.Y;
this.Size = win.Size;
Заключение
Поздравляю, вы справились с этой стеной текста, надеюсь вы нашли что почерпнуть из этой статьи.
Автор статьи Саня a.k.a Yukikaze собственной персоной
Автор статьи Саня a.k.a Yukikaze собственной персоной