0

1年間のように、これまで機能していたこのコードを添付します。

// 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:最後に aを追加するtextWriter.WriteLine("XYZ")と、直後に表示されます</Content>が、XYZの後にゴミが表示されます(のように</Content>XYZ>AT-TEST-2348</UserID>:)

EDIT3: 非常に奇妙です。バッファーを 8192 に増やしたところ、問題なく動作しました。その後、4096 に戻り、正常に動作し続けました。私はこのFileOptions.SequencialScanを見て、「正しい操作はまだ隔離されています」と書いています。うーん、これは何かの間違いかな(?)

ありがとう

4

2 に答える 2

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を参照してください。

于 2013-06-13T14:45:21.413 に答える