Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlSerializer(类型)能否随机抛出?_C#_.net - Fatal编程技术网

C# XmlSerializer(类型)能否随机抛出?

C# XmlSerializer(类型)能否随机抛出?,c#,.net,C#,.net,我们遇到了一个令人困惑的情况,正常运行数百次的代码突然停止工作。它是一个通常运行数周的应用程序 问题是,XmlSerializer(Type)是否有可能损坏的缓存 背景: 它发生在启动时,有一次,我们得到了很多例外。当检测到问题时(几天后)重新启动后,它再次正常运行 我们已将问题追踪到以下代码: internal static class StateManager { private static XmlSerializer queueSerializer = new XmlSerial

我们遇到了一个令人困惑的情况,正常运行数百次的代码突然停止工作。它是一个通常运行数周的应用程序

问题是,
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;
    }
}
据我们了解,这给罪犯留下了两种可能性:

private static XmlSerializer queueSerializer = new XmlSerializer(typeof(List<QueueItem>));
我们仔细检查了SubSystem.PersistentDirectory,认为它是无辜的


由于这是在客户机的字段中发生的,我们无法复制它,因此无法检查内部异常

你应该抓住它!我发现这里没有静态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!
        }
    }
}
内部静态类StateManager
{
私有静态XmlSerializer queueSerializer;
私有静态只读字符串队列路径;
内部静态StateManager(){
尝试
{
queueSerializer=新的XmlSerializer(typeof(List));
queuePath=Path.Combine(SubSystem.PersistentDirectory,“Queue.xml”);
}
捕获(例外情况除外)
{
//日志,日志,日志!
抛出;//基本:您必须重新抛出!
}
}
}
至于实际的违规行,没有跟踪就无法确定:您所知道的只是您的类型无法初始化,没有关于原因的指示。 据我猜测,最可能的原因是:

  • 您提供给
    XmlSerializer
    的数据中出现了一些问题(而不是
    XmlSerializer
    本身:我高度怀疑
    系统
    命名空间中的任何内容是否容易随机爆炸)
  • 您的
    子系统.PersistentDirectory
    包含损坏的数据
  • (不太可能,但您永远不知道…)其他内容被破坏,异常实际上与可能位于其他位置的违规代码无关

什么是
子系统。PersistentDirectory
?更详细地查看异常-它应该包括一个内部异常,给出确切的原因。@Jon Skeet这是一个罕见事件的事后分析,我们不能在调试器中查看它。我不建议使用调试器。日志中应该有完整的堆栈跟踪,其中应该包括内部异常。如果日志中没有完整的堆栈跟踪,这是第一件要修复的事情。@Jon Skeet非常正确!我们绝对应该这样做,答案非常感谢!但是,如果它可以是XmlSerializer的话,它并没有回答所写的问题。。。简言之:我倾向于假设“如果它来自
System
名称空间,那么它会按预期工作”。
    private static readonly string queuePath = Path.Combine(SubSystem.PersistentDirectory, "Queue.xml");
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!
        }
    }
}