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!
}
}
}