Как вы сохраняете данные на диск из .NET? - PullRequest
10 голосов
/ 19 января 2011

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

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

Очевидное решение состоит в том, чтобы хранить все как блоб в базе данных: одну запись, возможно, содержащую длинную строку. Это злоупотребление базой данных или рекомендуемая практика? Другим решением может быть использование базы данных XML? Есть ли какие-либо альтернативы базам данных, которые я должен рассмотреть?

Наконец, я делаю это из F #, поэтому идеальное решение для сохранения данных из .NET было бы идеальным ...

РЕДАКТИРОВАТЬ: Обратите внимание, что форматирование (например, сериализация) не имеет значения, так как я могу тривиально конвертировать между форматами с помощью F #. Речь идет о получении подтверждения того, что запись была завершена вплоть до энергонезависимого хранилища (то есть дискового накопителя), и никакая часть записанных данных по-прежнему не хранится в энергозависимом хранилище (например, кэш-память ОЗУ), так что Я могу продолжать в безопасности в этом знании (например, удалив старую версию данных с диска).

Ответы [ 6 ]

10 голосов
/ 20 января 2011

Некоторые конструкторы для класса .NET FileStream принимают параметр типа FileOptions .Одним из значений для FileOptions является WriteThrough , которое «Указывает, что система должна выполнить запись через любой промежуточный кэш и перейти непосредственно на диск». *

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

7 голосов
/ 19 января 2011

Это можно сделать с помощью Сериализация .

.NET Framework включает в себя множество встроенных опций для сериализации данных на диск, в том числе с использованием двоичных или XML-форматов.Подробные статьи с инструкциями представлены в документации MSDN.

4 голосов
/ 19 января 2011

Для этого вам потребуется ресурс, который позволит вам участвовать в Transaction (чаще всего вы будете использовать TransactionScope.

Большинство баз данных будут участвовать в Transaction, если таковая содержится. Операциями с дисками также можно управлять с помощью Transaction, но вам придется выполнить определенную работу , чтобы использовать ее.в .NET .

Кроме того, обратите внимание, что это доступно только в Windows Vista и более поздних версиях.

Если вы пойдете по маршруту базы данных, то вы можете хранить сериализованное содержимое ваших деревьевв BLOB-объекте (или тексте, в зависимости от механизма сериализации).

Обратите внимание, что вы также можете использовать функциональность FILESTREAM в SQL Server (я полагаю, версии 2008 и выше) для храненияВаши файлы в файловой системе и получают преимущества транзакций в SQL Server.

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

Раньше я не использовал db4o из F #, но все дело в сохранении графов объектов CLR на диск транзакционным способом. Если он работает с записями и дискриминированными профсоюзами, он может вас устроить.

Редактировать: Я только что протестировал db4o 8.0 (версия .NET 4), и он, похоже, отлично справляется как с типами записей, так и с иерархиями различающихся объединений.

0 голосов
/ 01 февраля 2011

Немного OT, так как OP не хотел XML, но, видя, что другие упоминали о форматере XML ... Если вы хотите сохранения текста, SoapFormatter обрабатывает случаи (циклы / графы объектов), которых нет у форматера XML по умолчанию,XML не так удобен для чтения, как XMLFormatter, но он более читабелен, чем двоичный:)

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

Попробуйте использовать XMLSerializer (System.Xml.Serialization).

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

Он может автоматически сохранять сложные структуры данных на основе их свойств, и вы можете использовать атрибуты для управления выводом, если хотите:

http://msdn.microsoft.com/en-us/library/83y7df3e.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...