【发布时间】: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 我添加了子类
标签: c# xml-serialization