4

次のように、StreamWriter で XmlSerializer を使用しています。

...
string xmlFile = GetXMLLocation(objToSaveType);
XmlSerializer Serializer = new XmlSerializer(objToSaveType);
using (StreamWriter sw = new StreamWriter(xmlFile))
    Serializer.Serialize(sw, objToSave);
...

これはほとんどの場合うまくいきますが、生成されたファイルがヌル文字でいっぱいになることはめったにありません。

...
        <Extension>0</Extension>
      </OrderProductLine>
      <OrderProductLine>
        <ProductDescription />
        <Commission>0.3</Commission>
        <UnitType />
        <UnitPrice>0</UnitPrice>
        <UnitQuantity>0</UnitQuantity>
        <PackageType />
        <Extension>0</Extension>
   [null x ~1 million]

自分で再現できたことはありません。シリアル化中にエラーは発生せず、プログラムのシャットダウン中にのみ発生するようです。

関連する質問:

  • ここ-明らかな修正、ライターはフラッシュしていません。usingClose() と同じ Dispose() 呼び出しを使用しています
  • ここ- 最良の答えは、エラーが見逃されたことを前提としています。私はエラーを生成しません。空のファイルとヌルで満たされたファイルは同じではありません。それにもかかわらず、回答の 1 つは、これがキャッシュの問題であることを示唆しています。

キャッシュの問題のアイデアが正しい場合に備えて、コードを次のように変更しました。

string xmlFile = GetXMLLocation(objToSaveType);
XmlSerializer Serializer = new XmlSerializer(objToSaveType);
using (Stream file = new FileStream(xmlFile, FileMode.Create,
                         FileAccess.Write, FileShare.None,
                         0x1000, FileOptions.WriteThrough))
    using (StreamWriter sw = new StreamWriter(file))
        Serializer.Serialize(sw, objToSave);

回避策についていくつかのアイデアがあります (主に、保存直後にデシリアライズするか、ロールバックするか、問題がある場合は再試行します)。非常に断続的であるため、上記で修正されたかどうかはまだわかりません。この投稿は、同様の状況にある他の人に考えられる修正方法を知らせるか、他の考えられる原因についてのアイデアを得るためのものです。読んでくれてありがとう。(PS最初のSO投稿、プロトコルを破っていたらごめんなさい!)

更新: 1 週間ほど経った今でも、バグは再発していません。指が交差していますが、これで問題が修正されたかどうかを合理的な確実性で知るには、実際には約1か月かかります.

更新: 2 週間半後、まだ良好です。

願わくば最終更新: 1 か月以上経った今でも問題ありません。結局、キャッシングが問題だったようです。

4

1 に答える 1

0

アプリケーションでこの問題を修正するために何をしたかを同僚と話しました。

アプリケーションのシャットダウン時に一部の xml データを保存しましたが、ファイルをディスクに書き込むスレッドがアプリケーションのシャットダウン プロセスによって強制終了されることがあるようです。

保存コマンドを、アプリケーションのシャットダウンからデータが変更された時点に移動しました。これで問題は解決しました。

于 2012-08-03T12:21:47.127 に答える