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.

据我们了解,这为罪魁祸首留下了两种可能性:

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 回答