我将此代码附加到现在,就像一年一样:
// prepare serializer (XSContent)
XmlSerializer serializer = new XmlSerializer(typeof(XSContent));
using (TextWriter textWriter = new StreamWriter(this.fileName, false, Encoding.UTF8))
{
// prepare the content for xml serialization
XSContent content = new XSContent();
content.UserList = XSConverter.ConvertList<XSUser, TBSUser>(input.UserList);
content.GroupList = XSConverter.ConvertList<XSGroup, TBSGroup>(input.GroupList);
// perform serialization
serializer.Serialize(textWriter, content);
}
但是今天,我用大量数据测试的代码相同:xml结果无效(请注意整个内容末尾的'剩余'):
<?xml version="1.0" encoding="utf-8"?>
<Content xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<UserList>
<User UserID="CI-0123">
{...}
</User>
{...}
</UserList>
<GroupList>
<Group GroupID="TEST01">
<GroupName>Test</GroupName>
<UserList>
<UserID>CI-0123</UserID>
</UserList>
</Group>
{...}
</GroupList>
</Content>rID>AT-TEST-2348</UserID>
<UserID>AT-TEST-2349</UserID>
<UserID>AT-TEST-2350</UserID>
这让我发疯,我被困住了。你认为我应该在哪里寻找?我做错了什么?
也许重要的是要提到这个xml文件是〜200Mb。此外,如果事情不明确,我可以提供更多信息。
EDIT1: 没有可能会干扰的现有文件。文件在我的测试中创建为新文件!
EDIT2:
如果我在最后添加textWriter.WriteLine("XYZ")
,它会出现在</Content>
之后,但我仍然看到XYZ之后的垃圾(例如:</Content>XYZ>AT-TEST-2348</UserID>
)
EDIT3: 很奇怪,当我将缓冲区增加到8192时,它工作得很好。在那之后,我回到4096并继续工作正常。我看到这个FileOptions.SequencialScan,他们写道:“仍然保证正确的操作”。好吧,我开始认为这可能出现了问题(?)
由于
答案 0 :(得分:2)
怎么样
using(var stream = new FileStream(path, FileMode.CreateNew, FileAccess.Write, FileShare.Read, 4096)) {
using (var textWriter = new StreamWriter(stream, Encoding.UTF8)) {
...
}
}
如果检查StreamWriter构造函数,则完成如下操作:
[SecurityCritical]
private static Stream CreateFile(string path, bool append, bool checkHost)
{
FileMode mode = append ? FileMode.Append : FileMode.Create;
return new FileStream(path, mode, FileAccess.Write, FileShare.Read, 4096, FileOptions.SequentialScan, Path.GetFileName(path), false, false, checkHost);
}
有关枚举值,请参阅http://msdn.microsoft.com/en-us/library/system.io.filemode.aspx。
答案 1 :(得分:0)
最后,当使用Truncate
模式时,它似乎有效(在我的情况下,文件始终存在,在应用启动期间创建)。