Datacontractserializer不会覆盖所有数据

时间:2011-01-07 01:07:54

标签: c# serialization datacontractserializer

我注意到如果我使用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));
        }
    }

2 个答案:

答案 0 :(得分:5)

这是因为您使用以下方式打开流:

stream = new FileStream(this.fileName, FileMode.OpenOrCreate);

尝试使用:

stream = new FileStream(this.fileName, FileMode.Create);

请参阅FileMode文档。

答案 1 :(得分:2)

我认为这是因为使用了FileMode.OpenOrCreate。如果文件已经退出,我认为文件正在打开,部分数据正在从起始字节被覆盖。如果您更改为使用FileMode.Create,则会强制覆盖任何现有文件。