DataContractSerializer写入损坏的数据

时间:2017-10-13 16:03:27

标签: c# .net xml serialization datacontractserializer

我正在使用以下代码在磁盘上存储一些对象:

    public static void Save<T>(T obj, string filename)
    {
        using (var output = System.IO.File.OpenWrite(filename))
        using (var writer = new System.Xml.XmlTextWriter(output, System.Text.Encoding.UTF8)
        {
            Formatting = System.Xml.Formatting.Indented
        })
        {
            var serializer = new System.Runtime.Serialization.DataContractSerializer(typeof(T));
            serializer.WriteObject(writer, obj);
        }
    }

有时保存的文件会被破坏,这意味着它包含一些随机的额外垃圾数据,可以阻止进一步的反序列化,例如:

<Parameters xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MyApp">
    ...
</Parameters>eters>

此处最后6个字符来自标记的某些遗留物,并阻止对此文件进行反序列化。为什么会发生这种情况?如何解决?

可以通过调用Save事件处理程序中的Form.Closing方法吗?

1 个答案:

答案 0 :(得分:1)

这是documented behavior with OpenWrite()

  

OpenWrite方法打开文件(如果文件路径已存在),或者如果文件不存在则创建新文件。对于现有文件,它不会将新文本附加到现有文本。相反,它会用新字符覆盖现有字符。 如果您覆盖较长的字符串(例如“这是对OpenWrite方法的测试”)使用较短的字符串(例如“第二次运行”),该文件将包含混合字符串(“OpenWrite方法的第二次运行测试”)。

因此,您需要在写入之前显式截断文件,或者只是删除它(如果存在)。

Alexander Petrov观察到new System.IO.FileStream(filename, FileMode.Create)在这种情况下是OpenWrite()的正确替代品。