2014-05-14 11 views
2

我使用的序列化需要的对象的代码(使用DataContractSerialier)序列化错误期间保存文件使用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次)。也许我可以检查该文件是否正确保存(尝试反序列化保存的文件),但我认为这是一个坏主意,因为我们需要在保存xml文件时随时运行反序列化过程。

+0

当你在不停止的情况下调用12000次方法时,他们是不是都在写同一个文件?编辑:您的本地系统上或网络共享上的文件? –

+0

不,任何时候我用新的文件名将文件保存到我的本地硬盘驱动器。 –

+2

只需添加,如果是同一个文件,'File.OpenWrite'将会覆盖文件中的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

非常感谢!固定 –