Мне нужно открыть файл, десериализовать List < из объектов, удалить один из объектов из списка и повторно сериализовать List < > обратно в файл, не отпуская блокировку файла.
Дезабилизация и удаление объекта из списка < > не проблема, проблема возникает, когда я пытаюсь и сериализую List < > обратно в файл, поскольку получаю остатки предыдущих данных... кто-нибудь знает, как удалить оставшиеся старые данные в конце файла?
Спасибо, Пол.
Я получаю остатки предыдущих данных
Я предполагаю, что вы открываете файл с доступом для чтения/записи и что вы держите его открытым между десериализацией и сериализацией? Вам необходимо:
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);
}
(не проверено)
Откройте файл как (FileMode.Truncate) при записи сериализованных данных обратно в файл. Это гарантирует, что файл полностью перезаписан вашими новыми данными, и вы не получите остатков существующих данных.
См. "FileMode.Truncate":
http://msdn.microsoft.com/en-us/library/system.io.filemode(VS.85).aspx
Кроме того, я бы рекомендовал использовать protobuf-net для использования в качестве механизма сериализации. Это быстрее и (в некоторых случаях, таких как обфускация) более надежная система сериализации.