Всем доброго дня! Сегодня я расскажу о простом и быстром способе сохранять объекты в файлы с дальнейшим использованием данных файлов. Когда это может пригодится? Ну например если Вы хотите организовать кеширование данных в Вашей программе.
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 {
.....
}