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 行导致空引用异常

java 对象引用为null时,出现的bug问题

Java认识NPE问题 - 空指针异常

java空指针异常:java.lang.NullPointException

片段管理器空引用异常