Файловый поток, блокировка и сериализация

2

Мне нужно открыть файл, десериализовать List < из объектов, удалить один из объектов из списка и повторно сериализовать List < > обратно в файл, не отпуская блокировку файла.

Дезабилизация и удаление объекта из списка < > не проблема, проблема возникает, когда я пытаюсь и сериализую List < > обратно в файл, поскольку получаю остатки предыдущих данных... кто-нибудь знает, как удалить оставшиеся старые данные в конце файла?

Спасибо, Пол.

  • 0
    Похоже, вы должны использовать базу данных. SQL Server Express 2008 бесплатен и имеет богатую поддержку столбцов XML.
  • 0
    Привет, Джон. Если бы я написал спецификацию, то это то, что я бы использовал, к сожалению, я этого не сделал, поэтому мне приходится обходиться с файлами.
Теги:

2 ответа

0
Лучший ответ

Я получаю остатки предыдущих данных

Я предполагаю, что вы открываете файл с доступом для чтения/записи и что вы держите его открытым между десериализацией и сериализацией? Вам необходимо:

  • Откройте файл только для чтения, десериализируйте свои данные и закройте файл
  • Откройте файл только для записи (без добавления в него), выполните сериализацию своих данных и закройте файл

UPDATE:

Как заблокировать файл между этими двумя отдельными операциями?

Хорошая точка... в этом случае вы можете попытаться обрезать поток, пока он открыт, используя SetLength:

using(FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite))
{
    data = Deserialize(fs);
    DoSomething(data);

    // Truncate the file :
    fs.SetLength(0)
    fs.Position = 0;

    Serialize(fs, data);
}

(не проверено)

  • 0
    Как сохранить файл заблокированным между этими двумя отдельными операциями?
  • 0
    смотри мой обновленный ответ
Показать ещё 1 комментарий
2

Откройте файл как (FileMode.Truncate) при записи сериализованных данных обратно в файл. Это гарантирует, что файл полностью перезаписан вашими новыми данными, и вы не получите остатков существующих данных.

См. "FileMode.Truncate":
http://msdn.microsoft.com/en-us/library/system.io.filemode(VS.85).aspx

Кроме того, я бы рекомендовал использовать protobuf-net для использования в качестве механизма сериализации. Это быстрее и (в некоторых случаях, таких как обфускация) более надежная система сериализации.

  • 0
    Спасибо за комментарий, но как сохранить файл заблокированным между этими двумя отдельными операциями?
  • 0
    У вас есть контроль над всеми процессами записи в файл? Если это так, используйте мьютекс для синхронизации: albahari.com/threading/part2.aspx#_Mutex
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню