Небольшое простое локальное хранилище данных для хранения пользовательских настроек - PullRequest
3 голосов
/ 09 декабря 2010

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

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

Требования

  1. Не требует установки со стороны базы данных. (создание таблицы и т. д.)

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

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

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

Мои идеи

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

  2. OODBMS: у меня нет опыта работы с ними, но я всегда думал, что они состоят из одной dll, поэтому было бы легко упаковать их в программу.

  3. Однажды, давным-давно, я создал приложение, которое хранило пользовательские настройки в реестре. Не знаю, ценится ли это до сих пор.

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

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

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

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

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);
2 голосов
/ 09 декабря 2010

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

1 голос
/ 09 декабря 2010

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

Как говорится, мне нравится то, что я видел в db4objects.

...