2013-12-21 5 views
1

Хорошо, мы сортируем/десериализируем что-то, но когда вы работаете с важными данными людей, вам нужно быть осторожным, чтобы объекты были сериализованы/десериализованы правильно на 100%. Например, давайте рассмотрим случай, когда ваше приложение умирает/принудительно закрывается во время сериализации. В большинстве случаев вы получите поврежденный объект, который не принимает меня, я не могу сказать, что могу вручную использовать baackup файла и писать флаг, lke не работает, прежде чем начинать сериализацию и добавлять флаг, выполняемый в конце процесса, и взять файл из резервной копии, если он не работает во время десериализации. Это не хорошо, потому что я должен сделать резервную копию очень большого файла после каждого изменения. Есть ли какая-нибудь возможность построить безопасную логику в популярных сериализаторах в .NET Framework или protobuf? Я не могу найти какую-либо информацию о безопасном сериализации. Или вы можете сказать мне abaut какой-то хороший шаблон, как сделать сериализацию неуверенно?Безопасная сериализация

+2

Нет. Если «очень большой файл» - это ваша проблема, вам явно нужно перейти в базу данных. Что поддерживает транзакции. –

+0

IMO вы можете вырезать сериализацию из этой проблемы: сначала выполните сериализацию - теперь у вас есть данные: как атомизировать мутацию данных безотказным способом? Это хорошо известная проблема, о которой люди, подобные людям РСУБД, знают много. –

+0

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

ответ

2

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

  1. Если данные достаточно мал, чтобы поместиться в один кластер диска (512 байт или 4K) используют FILE_FLAG_WRITE_THROUGH | FILE_FLAG_NO_BUFFERING атомарной записи одного сектора диска в одном вызове записи.
  2. Использовать транзакционную NTFS для атомарного ввода любого количества данных.
  3. Написать в .tmp файл и атомарно переименовать имя разыскиваемого файла
  4. Используйте другие средства для достижения атомарность, как базы данных (может быть, даже SqlLite, ESENT, ...) или CLFS из Windows.
Смежные вопросы