C#: Сериализация и десериализация или как быстро сохранить объкт в файл

Всем доброго дня! Сегодня я расскажу о простом и быстром способе сохранять объекты в файлы с дальнейшим использованием данных файлов. Когда это может пригодится? Ну например если Вы хотите организовать кеширование данных в Вашей программе.
Microsoft постарался и предоставил нам очень много различных способов сериализации объектов. Я останавлюсь на бинарной серелизации, потому что на мой взгляд, она является более универсальной по сравнению с JSON или XML.

Для начала подключим в наш файл программы следующие namespace

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

А далее опишем две функции. Первая CreateCache — создает кеш объекта, вторая — ReadCache — создает объект из кеша.

//filePath - полный путь и имя будущего файла с кешем
//obj - объект который мы хотим сохранить
public void CerateCache(string filePath, object obj)
{
    IFormatter formatter = new BinaryFormatter();
    using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
    {
       formatter.Serialize(stream, obj);
    }
}

//filePath - полный путь и имя файла с кешем
//obj - объект в который мы хотим прочитать данные
//возвращаем true если смогли прочитать кеш
public bool ReadCache(string filePath, out object obj)
{
    obj = null;
    if (File.Exists(filePath))
    {
        IFormatter formatter = new BinaryFormatter();
        using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            obj = formatter.Deserialize(stream);
        }
    }
    return obj != null;
}

Пример использования

object resultCache = null;
List<string> result = null;
string cacheFile = "CaсheFile.bin";
if (Cache(cacheFile, out resultCache))
{
     result = resultCache as List<string>;
}
else
{
   result = new List<string>() { "String1", "String2", "String3", "String4", "String5" };
   Cache(cacheFile, result);
}

Еще один момент, связанный с ситуацией, когда вы хотите сериализовать Вас собственный класс. Его необходим пометить атрибутом [Serializable].

[Serializable]
class MyClassName { 
.....
}
Запись опубликована в рубрике C#, C# Windows Phone с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.