Я сделал это, написав свой собственный код сериализации в XML, пометив элементы в соответствии с полями конфигурации.Когда я десериализую, я запрашиваю XML для каждого элемента, который я хочу заполнить.Если я десериализую старую версию в новую конфигурационную схему, которая имеет дополнительные элементы, XML-запрос возвращает ноль, и я вместо этого вставляю значение по умолчанию.Это позволяет мне обрабатывать списки иерархических данных, я могу зашифровать любую их часть, которая мне нужна, и я не делаю версию XML.Хотя это немного сложнее, чем использование XMLSerializer, мои данные конфигурации меняются не очень часто, поэтому оно того стоило.
Поскольку у вас может быть много пользователей, вы можете сохранить XML каждого пользователя в виде строки вбаза данных. System.Data.Sqlite , RaptorDb и FileDb хорошо работают для этого, как и PersistentDictionary .
Покадругая альтернатива - хранить ваши данные в словарях словарей и использовать SharpSerializer , чтобы сохранить их в формате XML либо в файл, либо в одну из вышеуказанных баз данных.