2014-05-14 3 views
2

я использую этот код для сериализации объектов требуется (используйте DataContractSerialier)Serialize Ошибка во время сохранения файла с помощью DataContractSerialize

try 
{ 
using (var stream = File.OpenWrite(filePath)) 
{ 
    var dcs = new DataContractSerializer(typeof(T)); 
    dcs.WriteObject(stream, obj); 
} 
} 
catch (Exception ex) 
{ 
throw new Exception("Error during write object to xml file", ex); 
} 

я не понимаю, но иногда этот метод добавления к концу XML-файла некоторые дополнительные символы. например: «eInfo>» (когда я удаляю «eInfo>» десериализация работает хорошо). Я нашел это, когда выполняю тестирование с высокой нагрузкой (вызовите этот метод 12000 раз без остановки). возможно, я могу проверить, что файл был сохранен правильно (попробуйте десериализовать сохраненный файл), но я думаю, что это плохая идея, потому что нам нужно запускать десериализацию procees в любое время при сохранении xml-файла.

+0

Когда вы вызываете метод 12000 раз без остановки, все ли они записываются в один и тот же файл? EDIT: файл в вашей локальной сети или в сети? –

+0

нет, в любое время я сохраняю файл с новым именем файла на локальном жестком диске. –

+2

Просто чтобы добавить, если это тот же файл, 'File.OpenWrite' будет _overwrite characters_ в файле, сначала не очистить файл. Это означает, что если ваша последняя запись (сериализация) была _shorter_, чем предыдущая запись, она оставит слева символы. Прочтите замечания на странице MSDN: http://msdn.microsoft.com/en-us/library/system.io.file.openwrite%28v=vs.110%29.aspx –

ответ

3

Это потому, что File.OpenWrite не усекает существующие данные. Вы переписываете файл с за вычетом данных. Мусор в конце - это то, что осталось от исходного файла. Я предлагаю вам использовать File.Create (который на самом деле создает или перезаписывать с усечением), или явно указывать усечение, или вызывать .SetLength(0) перед записью.

+0

большое спасибо! исправлено –

Смежные вопросы