0

通常は何百回も実行されるコードが突然動作しなくなったという紛らわしいケースがあります。通常は数週間実行されるアプリケーションです。

問題は、XmlSerializer(Type)破損する可能性のあるキャッシュがどこかにあるかということです。

背景:

ある時、起動時に多くの例外が発生しました。問題が検出されたときに再起動した後(数日後)、正常に動作しました。

問題を次のコードまで追跡しました。

internal static class StateManager
{
    private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));

    private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");

    internal static void SaveQueue(List<QueueItem> upcomingTasks)
    {
        XmlWriter xmlWriter = XmlWriter.Create(queuePath, xmlSettings);
        queueSerializer.Serialize(xmlWriter, upcomingTasks);
        xmlWriter.Close();
    }

    internal static List<QueueItem> GetQueue()
    {
        var queue = new List<QueueItem>();

        try
        {
            var xmlDoc = new XmlDocument();
            xmlDoc.Load(queuePath);
            using (XmlReader reader = XmlReader.Create(new StringReader(xmlDoc.OuterXml)))
            {
                queue = queueSerializer.Deserialize(reader) as List<QueueItem>;
            }
        }
        catch (Exception e)
        {
            AppTrace.Write(TraceLevel.Error, string.Format("Failed to load State Queue: {0}", e.Message));
        }

        return queue;
    }
}

エラーは次のとおりです。

Failed to load State Queue: The type initializer for 'StateManager' threw an exception.

私たちが理解しているように、これは犯人に2つの可能性を残しています:

private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));

また

    private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");

私たちは慎重にチェックSubSystem.PersistentDirectoryしましたが、それは無害であると信じています.

これはクライアントのマシンのフィールドで発生したものであり、再現できないため、内部例外を確認することはできません。

4

1 に答える 1

1

あなたはそれをキャッチする必要があります!そこには静的なctorがないことがわかります。次のようなことを試みて、初期化を延期して、詳細を知ることができます。

internal static class StateManager
{
    private static XmlSerializer queueSerializer;
    private static readonly string queuePath;

    internal static StateManager(){
        try
        {
            queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
            queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
        }
        catch(Exception ex)
        {
            // Log, log, log!
            throw; // Essential: you MUST rethrow!
        }
    }
}

実際の問題のある行に関しては、トレースなしで確実に伝える方法はありません: 知っているのは、型を初期化できなかったことだけであり、理由についての兆候はありません。私が推測できる限り、最も可能性の高い原因は次のとおりです。

  • にフィードするデータで何かが壊れていますXmlSerializer(XmlSerializerそれ自体ではありません:名前空間からのものがランダムに爆発する傾向があることは非常に疑わしいです)System
  • 壊れSubSystem.PersistentDirectoryたデータが含まれています
  • (可能性は低いですが、わかりません...) 他の何か壊れており、例外は実際には問題のあるコードに関連していません。別の場所にある可能性があります。
于 2013-10-08T15:02:10.007 に答える