为啥我会收到序列化错误?
Posted
技术标签:
【中文标题】为啥我会收到序列化错误?【英文标题】:Why am I getting a serialization error?为什么我会收到序列化错误? 【发布时间】:2011-03-31 20:31:45 【问题描述】:我有以下代码:
class Program
static void Main(string[] args)
string xml = @"<ArrayOfUserSetting>
<UserSetting>
<Value>Proposals</Value>
<Name>LastGroup</Name>
</UserSetting>
<UserSetting>
<Value>Visible</Value>
<Name>WidgetsVisibility</Name>
</UserSetting>
</ArrayOfUserSetting>";
List<UserSetting> settings =
GetObjFromXmlDocument<List<UserSetting>>(xml);
public static T GetObjFromXmlDocument<T>(string xml)
T customType;
XmlSerializer serializer = new XmlSerializer(typeof(T));
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(xml);
using (XmlNodeReader xmlNodeReader = new XmlNodeReader(xmlDocument))
customType = (T)serializer.Deserialize(xmlNodeReader);
return customType;
[Serializable]
public class UserSetting
public string Value get; set;
public string Name get; set;
代码运行良好,对 GetObjFromXmlDocument 的调用会生成一个 List 集合。但是,当执行 XmlSerializer serializer = new XmlSerializer(typeof(T));
时,我总是在 mscorlib.dll 中遇到 System.IO.FileNotFoundException
类型的第一次机会异常。
所以我进入了 Debug/Exception 并打开了 Managed Debugging Assistants。我在那条线上得到了以下信息:
显示名称为“mscorlib.XmlSerializers”的程序集未能在 ID 为 1 的 AppDomain 的“LoadFrom”绑定上下文中加载。失败的原因是:System.IO.FileNotFoundException:无法加载文件或程序集“ mscorlib.XmlSerializers,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089' 或其依赖项之一。该系统找不到指定的文件。 文件名:'mscorlib.XmlSerializers, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'
有人可以解释为什么会这样吗?我可以对UserSetting
类做些什么来使问题消失吗?该应用程序对性能非常敏感,我宁愿没有例外。
【问题讨论】:
【参考方案1】:Microsoft says:
XmlSerializer 尝试加载 预先生成的序列化程序,以避免 序列化代码的编译 在飞行中。没有简单的方法可以 检查“将由以下人员找到程序集 Assembly.Load() 调用”,它将是 复制融合路径搜索和 XmlSerializer 中的加载器逻辑。
当找不到“预生成的序列化器”时,似乎在XmlSerializer中抛出并处理了FileNotFound异常,这将导致生成序列化代码。
【讨论】:
谢谢,这很有帮助!更重要的是,如果您在调试时看到此问题,只需按 F5,您的程序就会继续运行(它不会崩溃……至少不会崩溃)。【参考方案2】:对于我所拥有的少数几个令人烦恼的 Visual Studio 项目,我更喜欢仅为 BindingFailure 和 System.IO.FileNotFoundException 禁用异常中断.
在 Visual Studio 中:Ctl-D、Ctl-E 用于异常对话框:
1) 在Managed Debugging Assistants
下取消选中BindingFailure2) 在公共语言运行时异常下取消选中 System.IO.FileNotFoundException。
啊,这样更好:-)
【讨论】:
以上是关于为啥我会收到序列化错误?的主要内容,如果未能解决你的问题,请参考以下文章