为什么我会收到序列化错误?

时间:2010-08-18 23:12:38

标签: c# exception .net-3.5 serialization c#-3.0

我有以下代码:

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集合。但是,当执行System.IO.FileNotFoundException时,我总是在mscorlib.dll中获得XmlSerializer serializer = new XmlSerializer(typeof(T));类型的第一次机会异常。

所以我进入了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课做些什么来使问题消失吗?该应用程序对性能非常敏感,我宁愿没有例外。

2 个答案:

答案 0 :(得分:10)

Microsoft says

  

XmlSerializer尝试加载   预先生成的序列化器以避免   编译序列化代码   在飞行中。没有简单的方法   检查“将组装成员   Assembly.Load()调用“,它会是   复制Fusion路径搜索和   XmlSerializer中的加载器逻辑。

当无法找到“预生成的序列化程序”时,看起来像是在XmlSerializer中抛出并处理了FileNotFound异常,这将导致生成序列化代码。

答案 1 :(得分:2)

对于我所选择的几个Visual Studio项目,这是一个烦恼,我更喜欢只为 BindingFailure System.IO.FileNotFoundException 禁用break异常

在Visual Studio中:Ctl-D,Ctl-E用于“例外”对话框:

1)取消选中托管调试助手

下的BindingFailure

2)取消选中公共语言运行时异常下的System.IO.FileNotFoundException。

啊,那更好: - )