У меня есть идея, как решить эту проблему, но я хотел знать, есть ли что-то более простое и более расширяемое для моей проблемы.
В программе, над которой я работаю, есть две основные формы данных: изображения и информация, связанная с этими изображениями. Информация, связанная с изображениями, ранее была сохранена в базе данных JET чрезвычайной простоты (четыре таблицы), которая оказалась медленной и неполной в хранимых полях. Мы переходим к новой реализации хранения данных. Учитывая простоту задействованных структур данных, я думал, что база данных была излишней.
Каждое изображение будет иметь собственную информацию (параметры захвата), будет частью группы изображений, которые взаимосвязаны (скажем, за тот же тридцатиминутный период), а затем частью большей группы (взятой из тот же человек). Прямо сейчас я храню людей в словаре с уникальным идентификатором. Затем у каждого человека есть список различных групп изображений, а у каждой группы изображений есть список изображений. Все эти классы сериализуемы, и я просто сериализую и десериализую словарь. Довольно простые вещи. Изображения хранятся отдельно, поэтому словарь не становится астрономическим по размеру.
Проблема в том, что происходит, когда мне нужно добавить новые информационные поля? Есть ли простой способ настроить эти структуры данных для учета возможных будущих изменений? В прошлом способ, которым я справлялся с этим в C, заключался в создании сериализуемой структуры с большим количеством пустых байтов (по крайней мере, k) для будущей расширяемости, при этом один из байтов в структуре указывает версию. Затем, когда программа прочитает структуру, она узнает, какую десериализацию использовать на основе массивного оператора switch (и старые версии могут читать новые данные, потому что посторонние данные будут просто переходить в поля, которые игнорируются).
Существует ли такая схема в C #? Например, если у меня есть класс, который представляет собой группу объектов String и Int, а затем я добавляю еще один объект String в структуру, как я могу десериализовать объект с диска, а затем добавить в него строку? Нужно ли мне смириться с наличием нескольких версий классов данных и фабрики, которая принимает поток десериализации и обрабатывает десериализацию на основе некоторой информации о версии, хранящейся в базовом классе? Или такой класс, как Dictionary, идеально подходит для хранения такого рода информации, поскольку он автоматически десериализует все поля на диске, и, если в него добавляются новые поля, я могу просто перехватывать исключения и подставлять в пустые строки и целые значения эти значения?
Если я прибегну к словарному подходу, будет ли скачок скорости, связанный с чтением / записью файла, а также временем получения параметров? Я полагаю, что если в классе есть только поля, то поиск полей происходит мгновенно, но в словаре с этим классом связаны небольшие издержки.
Спасибо!