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