C # Сохранение объектов между сеансами пользователя без использования базы данных - PullRequest
2 голосов
/ 31 января 2011

Я делаю простую Winforms, которая читает текстовый файл и выполняет некоторый анализ, чтобы поместить его в объекты C #, которые затем обрабатываются моим приложением.

Я хотел бы проанализировать файл один раз. Затем уйдите на неделю, вернитесь и загрузите все объекты обратно в мое приложение.

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

Ответы [ 7 ]

3 голосов
/ 31 января 2011

Вы говорите о сериализации .

Посмотрите на DataContractSerializer для этого.Если вам нужен файл без XML, вы можете попробовать DataContractJsonSerializer.

Вы просто добавляете DataContract и DataMember атрибутов, указывающих сериализатору, как управлять сериализацией.

Если ваши объекты не изменятся (новые / старые / переименованные свойства и видимость), и вам не нужно читать формат сериализации, вы можетепопробуйте BinaryFormatter.


В работе фрейма есть несколько более старых сериализаторов (XmlSerializer, BinaryFormatter и более), но лучший контроль над форматом сериализациибудет с вышеупомянутым).

2 голосов
/ 31 января 2011

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

1 голос
/ 31 января 2011

Вы можете использовать сериализацию, как раньше.

Хорошее место для сохранения данных - папка LocalData в Windows -

Environment.SpecialFolder.LocalApplicationData
1 голос
/ 31 января 2011

Простейшим способом хранения состояния объекта, не связанным с БД, является сериализация. Пометьте свой класс как Serializable или DataContract, затем используйте BinaryFormatter (или DataContractSerializer, если вы использовали DataContract), чтобы преобразовать объект в постоянное состояние. Затем его можно сохранить в файл, который можно загрузить при запуске приложения и выполнить его десериализацию аналогичным образом. Помните, что члены класса, включая дочерние классы, должны быть сериализуемы таким же образом, и что вы потеряете любые ссылки на несериализованные элементы, такие как указатели и ссылки на делегаты.

1 голос
/ 31 января 2011

Вероятно, самый простой способ сделать это - сериализовать объекты непосредственно в файл, используя класс BinaryFormatter.Вам нужно убедиться, что все ваши типы помечены как [Serializable], но этот подход быстрый и простой.

Вот простой пример методов «чтения» и «записи» для произвольного объектаgraph:

private void SerializeToFile(string fileName, object o)
{
    var binaryFormatter = new BinaryFormatter();
    using (var fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        binaryFormatter.Serialize(fileStream, o);
    }
}

private object DeserializeFromFile(string fileName)
{
    var binaryFormatter = new BinaryFormatter();
    using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.None))
    {
        return binaryFormatter.Deserialize(fileStream);
    }
}

Другие подходы включают XmlSerialization (класс XmlSerializer) - лучше, если вы хотите, чтобы сериализованные объекты были удобочитаемыми или редактируемыми для человека или использовали более новую DataContractSerializer.

1 голос
/ 31 января 2011

Вы можете просто сериализовать их в файл XML. Просто, быстро и легко (если кто-то не взломает файл).

0 голосов
/ 31 января 2011

Что не так с базой данных? Если вы не хотите иметь полный движок с его настройкой и связанными проблемами, возможно, вы можете взглянуть на «файловые» базы данных ...

Мои первые жесты:

  • SqlCompact
  • Доступ к базам данных
  • SqlLite

...

В зависимости от сложности ваших объектов для сохранения, это может быть хорошим решением.

...