我注意到如果我使用Datacontractserializer将对象保存回文件,如果新xml的长度比文件中最初存在的xml短,则原始xml的残余超出新xml的长度将保留在文件中并将破坏xml。
有没有人有一个很好的解决方案来解决这个问题?
这是我用来持久保存对象的代码:
/// <summary>
/// Flushes the current instance of the given type to the datastore.
/// </summary>
private void Flush()
{
try
{
string directory = Path.GetDirectoryName(this.fileName);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
FileStream stream = null;
try
{
stream = new FileStream(this.fileName, FileMode.OpenOrCreate);
for (int i = 0; i < 3; i++)
{
try
{
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, new System.Text.UTF8Encoding(false)))
{
stream = null;
// The serializer is initialized upstream.
this.serializer.WriteObject(writer, this.objectValue);
}
break;
}
catch (IOException)
{
Thread.Sleep(200);
}
}
}
finally
{
if (stream != null)
{
stream.Dispose();
}
}
}
catch
{
// TODO: Localize this
throw;
//throw new IOException(String.Format(CultureInfo.CurrentCulture, "Unable to save persistable object to file {0}", this.fileName));
}
}
答案 0 :(得分:5)
这是因为您使用以下方式打开流:
stream = new FileStream(this.fileName, FileMode.OpenOrCreate);
尝试使用:
stream = new FileStream(this.fileName, FileMode.Create);
请参阅FileMode
文档。
答案 1 :(得分:2)
我认为这是因为使用了FileMode.OpenOrCreate
。如果文件已经退出,我认为文件正在打开,部分数据正在从起始字节被覆盖。如果您更改为使用FileMode.Create
,则会强制覆盖任何现有文件。