为啥我会收到序列化错误?

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 项目,我更喜欢仅为 BindingFailureSystem.IO.FileNotFoundException 禁用异常中断.

在 Visual Studio 中:Ctl-D、Ctl-E 用于异常对话框:

1) 在Managed Debugging Assistants

下取消选中BindingFailure

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

啊,这样更好:-)

【讨论】:

以上是关于为啥我会收到序列化错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 XML 反序列化函数中收到此错误?

为啥我会收到这种错误验证错误?

为啥我会收到此错误

为啥我会收到错误数量的参数错误?

为啥我会收到错误消息?

为啥我会收到 Laravel Composer 解析错误?