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