вторник, 20 сентября 2011 г.

Сериализация (Serialization)
Основная моя деятельность в первую очередь связана с такими языками как Assembler, C (в первую очередь для микроконтроллеров) и один из диалектов Basic'а. В последнее время часто приходится работать с STL, FBD, LD (языки программирования для ПЛК). С объектно-ориентированным программированием сталкиваюсь довольно давно, но глубоко изучить его на тот момент так и не удалось.
И ВОТ! Сейчас довольно много занимаюсь этой темой.
Хотелось бы осветить один важный момент, а именно: сохранение различных настроек, состояний и тому подобное.
Если того не требует специфика (например мне как-то пришлось конфигурацию выносить в файл в формате XML (а первый вариант был вообще ASCII-текст), это нужно для того, чтобы была возможность править конфигу в ручную) можно использовать такую приятную вещь как сериализация!
Так как я рассматриваю всё в рамках .NET, то позволю себе процитировать великого Эндрю Троелсена: "Сериализация (serialization) - это термин, описывающий процесс преобразования объекта в линейную последовательность байтов".
То есть -  имеем мы объект и хотим его сохранить (например объект содержит конфигурацию), используя сериализацию, мы с минимальными усилиями можем это сделать. Нет необходимости городить всякие парсеры и т.п. Всё Очень Просто!
Алгоритм наших действий примерно такой:
1. Определиться с тем, какой класс должен быть доступен для сериализации и особрым образом пометить его (с помощью атрибута [Serializable]):
[Serializable]
public struct workSer
{
public string Val1;
public string Val2;
public string Val3;
}
2. Выбрать формат, в котором будет сохраняться объект (двоичный или SOAP). Будет использовать двоичный, для этого нам нужен класс BinaryFormatter, который лежит в пространстве имён: System.Runtime.Serialization.Formatters.Binary.
3. Пользуемся!

Для сведения разных вопросов по возможности к нулю, вот "рыба":

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace workSerialization
{
[Serializable]
public struct workSer
{
public string Val1;
public string Val2;
public string Val3;
}
public class test
{
public static void Main()
{
workSer ws = new workSer();
ws.Val1 = "first";
ws.Val2 = "second";
ws.Val3 = "third";

FileStream myStream = File.Create("config.dat");

BinaryFormatter myBF = new BinaryFormatter();
myBF.Serialize(myStream, ws);
myStream.Close();

myStream = File.OpenRead("config.dat");
workSer ws2 = (workSer)myBF.Deserialize(myStream);
Console.WriteLine("ws2 Valx = {0}, {1}, {2}", ws2.Val1, ws2.Val2, ws2.Val3);
myStream.Close();
Console.ReadLine();
}
}
}

Буду очень рад, если кому-то пригодится)))

Комментариев нет:

Отправить комментарий