序列化期间无效的XML

时间:2013-06-13 14:32:58

标签: .net xml serialization

我将此代码附加到现在,就像一年一样:

// 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,他们写道:“仍然保证正确的操作”。好吧,我开始认为这可能出现了问题(?)

由于

2 个答案:

答案 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模式时,它似乎有效(在我的情况下,文件始终存在,在应用启动期间创建)。