Небольшое простое локальное хранилище данных для хранения пользовательских настроек

У меня есть это крошечное приложение winforms на С#, которое НЕ будет увеличиваться в любом случае. Это всего лишь два поля ввода и кнопка.

Я хочу знать, знаете ли вы, ребята, как хранить значения, которые пользователь вводит в локальном хранилище данных. Вы можете считать 10 записей большим количеством данных для этого сценария.

Требования

  1. Это не должно требовать какой-либо настройки со стороны базы данных. (создание таблиц и т.д.)

  2. Я должен иметь возможность просто дать ему объект, и он должен его сохранить, я не хочу тратить на это время.

  3. Данные должны быть достаточно легко извлекаемыми.

  4. Я хочу иметь возможность повторно использовать эту вещь для каждого небольшого приложения, которое я создаю подобным образом.

Мои идеи

  1. Объект POCO, который будет XML-сериализован и сохранен в папке «Локальные настройки». После загрузки приложения этот файл десериализуется обратно в объект POCO.

  2. ООСУБД: у меня нет опыта работы с ними, но я всегда думал, что они состоят из одной dll, поэтому их будет легко упаковать с помощью программы.

  3. Когда-то, очень давно, я создал приложение, которое хранило пользовательские настройки внутри реестра. Не знаю, ценится ли это до сих пор.

Какой подход, по вашему мнению, является лучшим?

Примеры кода очень ценятся!


person Peter    schedule 09.12.2010    source источник


Ответы (3)


Я принял во внимание оба ответа и построил следующее:

public static class IsolatedStorageExtensions
{
    public static void SaveObject(this IsolatedStorage isoStorage, object obj, string fileName)
    {
        IsolatedStorageFileStream writeStream = new IsolatedStorageFileStream(fileName, FileMode.Create);
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Serialize(writeStream, obj);
        writeStream.Flush();
        writeStream.Close();
    }

    public static T LoadObject<T>(this IsolatedStorage isoStorage, string fileName)
    {
        IsolatedStorageFileStream readStream = new IsolatedStorageFileStream(fileName, FileMode.Open);
        BinaryFormatter formatter = new BinaryFormatter();
        T readData = (T)formatter.Deserialize(readStream);
        readStream.Flush();
        readStream.Close();

        return readData;
    }
}

Объект-оболочка POCO, который содержит эти данные для сериализации:

[Serializable]
internal class DataStoreContainer
{
    public DataStoreContainer()
    {
        UserIDs = new List<int>();
    }

    public List<int> UserIDs { get; set; }
}

Чтобы использовать эти расширения:

private IsolatedStorageFile _isoStore = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
private DataStoreContainer _data = new DataStoreContainer();
private const string FILENAME = "MyAppName.dat";

И в любом методе, где вы хотите получить данные:

_data = _isoStore.LoadObject<DataStoreContainer>(FILENAME);

Чтобы сохранить данные:

_isoStore.SaveObject(_data, FILENAME);
person Peter    schedule 10.12.2010
comment
Кажется, я помню, что у нас были проблемы в нашем проекте с изолированным хранилищем, когда мы увеличили номер версии приложения. Я могу ошибаться, но я не думаю, что настройки автоматически копируются при обновлении номеров версий. Возможно, вы захотите проверить это, если это сценарий в ваших приложениях. - person Damian; 10.12.2010
comment
Спасибо за внимание. Поскольку это такое маленькое приложение, я не проверяю его версии. Я планирую использовать этот метод для будущих приложений, поэтому я добавил вашу заметку в качестве комментария в свою библиотеку :-) - person Peter; 10.12.2010
comment
Отличное решение для небольших проектов, очень помогло мне и сэкономило кучу времени, спасибо - person Paul Talbot; 03.10.2013

Вы смотрели изолированное хранилище? Он хранит данные в локальном файле, специфичном для этого пользователя (или для приложения, в зависимости от того, как вы укажете). Вы можете легко сериализовать объекты в хранилище и из хранилища, поскольку оно основано на потоках. Это звучит как идеальное решение для вашей проблемы.

person Jim Mischel    schedule 09.12.2010

Поскольку вы заявляете, что 10 элементов будет много, я бы проголосовал за № 1 или вариант № 1, двоичную сериализацию ... вы, похоже, не указываете, что возможность чтения данных важна, а двоичные данные должны дать вам меньше размеры файлов, хотя, если 10 много, это все равно не должно иметь значения.

При этом мне нравится то, что я видел в db4objects.

person Damian    schedule 09.12.2010