В данном задании требуется обучится работать с универсальными классами и универсальными методами. Также затронем расширения для классов и бинарную сериализацию/десериализацию.
Расширить функционал прошлого задания, в котором требуется:
- Разработать универсальные методы для сохранения и загрузки
T
в файл по определенному пути:
/// <summary>
/// Хранилище данных.
/// </summary>
public static class Storage
{
/// <summary>
/// Сохранение объекта в файл.
/// </summary>
/// <param name="data">Объект</param>
/// <param name="filePath">Путь к файлу</param>
/// <typeparam name="T">Тип объекта</typeparam>
public static void Save<T>(T data, string filePath)
{
var bytes = data.GetBytes();
// Сохраняем на диск по определенному пути...
// Обработка исключений...
// ...
}
/// <summary>
/// Загрузка объекта из файла.
/// </summary>
/// <param name="filePath">Путь к файлу</param>
/// <typeparam name="T">Тип объекта</typeparam>
/// <returns>Объект</returns>
public static T Load<T>(string filePath)
{
// Чтение файла по определенному пути...
// Десериализация данных...
// Обработка исключений...
// ...
// return ...
}
}
- Разработать универсальный класс, реализующий интерфейс
IDictionary<TKey, TValue>
, который будет вызывать события при добавлении и удалении элементов.
/// <summary>
/// Класс вызывающий события при добавлении и удалении объектов из коллекции.
/// </summary>
public class ObservableDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
// ...
}
- Разработать расширение для типа
object
.
/// <summary>
/// Расширения для object.
/// </summary>
public static class ObjectExtensions
{
/// <summary>
/// Получение байтового представления объекта.
/// </summary>
/// <returns>Байтовое представление объекта</returns>
public static byte[] GetBytes(this object data)
{
// Сериализация object в массив байт...
// return массив байт
}
}
- Объединить все наработки в предыдущих 3-х подзаданиях.
В результате должно получится приложение, которое позволяет получить погоду.
ObservableDictionary
выступает в роли кэша, который хранит погоду ранее запрашиваемых городов. При добавлении нового города в ObservableDictionary должно вызватся событие, на которое подписан некоторый метод, который будет сохранять данные с помощью класса Storage, а сериализовать данные для преобразование объектов массив байт с помощью расширенияObjectExtensions
.
При последующих загрузках приложения требуется загружать кэш с предыдущих сессиях приложения.
- Для всех классов и публичных методов/полей/свойств требуется добавить документирующие XML комментарии.