关于C# XmlSerializer抛出异常 反射类型"ClassName"时出错 处理办法

问题 https://stackoverflow.com/questions/60573/xmlserializer-there-was-an-error-reflecting-type

在C#中,我们会使用用XmlSerializer将对象进行序列化和反序化操作。

下面是一个将对象序列化的示例代码:

        private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding)
        {
            if (o == null)
                throw new ArgumentNullException("o");
            if (encoding == null)
                throw new ArgumentNullException("encoding");

            XmlSerializer serializer = new XmlSerializer(o.GetType());

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            settings.NewLineChars = "\r\n";
            settings.Encoding = encoding;
            settings.IndentChars = "    ";

            // 不生成声明头
            //settings.OmitXmlDeclaration = true;

            // 强制指定命名空间,覆盖默认的命名空间。
            XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
            namespaces.Add(string.Empty, string.Empty);

            using (XmlWriter writer = XmlWriter.Create(stream, settings))
            {
                serializer.Serialize(writer, o, namespaces);
                writer.Close();
            }
        }

大多数情况,会在XmlSerializer serializer = new XmlSerializer(o.GetType());这句话报错:

报错消息为:反射类型 "XXXXX" 时出错(XXXXX是具体的某个具体的类名)

英文报错为:There was an error reflecting type "XXXXXX"

解决办法:

1.先检查要序列化的对象类,是否有无参数构造函数,需要给涉及的类提供无参数构造函数

2.检查抛出来Exception对象,该Exception对象会有一个inner对象(参考下面代码ex.InnerException对象)该inner对象就会指示是哪个具体属性、类成员。问题就出在该子成员上,需根据实际情况进行检查修改,例如重复同名的xmlattribute、不能被序列化的子类等等,可以通过XmlIgnoreAttribute来忽略某些属性,进行排查

catch (Exception ex)
{
   string msg = "处理失败,失败原因:\r\n" + ex.Message;

   if (ex.InnerException != null)
   {
      msg += "\r\n具体原因:\r\n" + ex.InnerException.Message;
   }

   MessageBox.Show(msg);
}

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值