XmlSerializer 空引用异常出现在 .NET 4.0 但不在 .NET 4.5
Posted
技术标签:
【中文标题】XmlSerializer 空引用异常出现在 .NET 4.0 但不在 .NET 4.5【英文标题】:XmlSerializer null reference exception appears in .NET 4.0 but not in .NET 4.5 【发布时间】:2012-08-19 20:58:29 【问题描述】:我遇到了一个奇怪的异常:
System.InvalidOperationException:生成 XML 文档时出错。 ---> System.NullReferenceException:对象引用未设置为对象的实例。 在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.XSArrayInfo.get_Item(对象 a,Int32 i) 在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write5_SearchAndReturnRules(字符串 n,字符串 ns,对象 o,布尔 isNullable,布尔需要类型) 在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write6_SearchAndReturnRules(Object o) --- 内部异常堆栈跟踪结束 --- 在 System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter,对象 o,XmlSerializerNamespaces 命名空间,字符串 encodingStyle,字符串 id) 在 System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter,Object o,XmlSerializerNamespaces 命名空间) 在 MergeExcelFilesForm.SaveSearchRulesToFile(StreamWriter 流)
using (var streamWriter = new StreamWriter(saveFileDialog.FileName))
SaveSearchRulesToFile(streamWriter);
public void SaveSearchRulesToFile(StreamWriter stream)
var rules = GetRules();
var rulesSerializer = new XmlSerializer(rules.GetType());
rulesSerializer.Serialize(stream, rules);
序列化类很简单,没有特殊属性(只给主类,不要认为子类很重要,因为它们更简单):
public class Rules
public List<SearchRule> SearchRules get; set;
public List<CopyRule> CopyRules get; set;
public int SourceHeaderRow get; set;
public int DestinationHeaderRow get; set;
public class SearchRule
public HeaderItem SearchFor get; set;
public HeaderItem SearchIn get; set;
public SearchRule()
public SearchRule(int indexFor, int indexIn)
SearchFor = new HeaderItem(indexFor);
SearchIn = new HeaderItem(indexIn);
public class HeaderItem
public HeaderItem()
public HeaderItem(int columnIndex, string displayName)
ColumnIndex = columnIndex;
DisplayName = displayName;
public HeaderItem(int columnIndex) : this(columnIndex, columnIndex.ToString())
public string DisplayName get; set;
public int ColumnIndex get; set;
public override string ToString()
return DisplayName;
现在有趣的部分 - 安装 .NET 4.5 时它运行良好,如果目标机器上只有 .NET 4.0 则失败,目标平台是 .NET 4.0。
【问题讨论】:
尽管安装了 .net 框架,但它会返回 null,但不,异常来自生成的程序集而不是 GetType()。 我怀疑所涉及的课程是理解问题的一部分:可惜我们看不到这一点。我怀疑调试它的唯一方法是使用 sgen.exe 和反射器/ildasm 来检查生成的程序集,但最终它听起来像是一个框架错误,现在已修复。因此,了解类型可能有助于提出解决方法 @MarcGravell 我添加了子类 【参考方案1】:您可以使用以下方法调试 XML 序列化进程:
<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
生成的源类位于您的本地临时文件夹中。因此,您可以轻松地逐步完成解析内容,并可能在您的 XML 文件中检测到问题。
【讨论】:
查看 4.0 和 4.5 框架生成的代码,我不得不说它们是完全不同的,到目前为止看起来问题实际上在于,生成的程序集与类型为的 dll 紧密耦合,只要我们使用 dll 打包,它可能是 4.0 生成的代码的问题。以上是关于XmlSerializer 空引用异常出现在 .NET 4.0 但不在 .NET 4.5的主要内容,如果未能解决你的问题,请参考以下文章
在 tableviewsource 上选择的 Monodevelop 行导致空引用异常