问题 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);
}