Reputation: 8540
I'm having a strange exception:
System.InvalidOperationException: There was an error generating the XML document. ---> System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.XSArrayInfo.get_Item(Object a, Int32 i) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write5_SearchAndReturnRules(String n, String ns, Object o, Boolean isNullable, Boolean needType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterRules.Write6_SearchAndReturnRules(Object o)
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) at MergeExcelFilesForm.SaveSearchRulesToFile(StreamWriter stream)
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);
}
Serialized class is quite simple, has no special attributes (giving just main class, don't think child classes are important, because they are even simplier):
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;
}
}
Now the interesting part - it runs fine when .NET 4.5 is installed and fails if it is only .NET 4.0 is on target machine, target platform is .NET 4.0.
Upvotes: 0
Views: 2974
Reputation: 7200
You can debug XML serializing processes with:
<system.diagnostics>
<switches>
<add name="XmlSerialization.Compilation" value="1" />
</switches>
</system.diagnostics>
The generated source classes are in your local temp folder. So you can easily step through the parsing stuff and maybe detect the problem in your XML file.
Upvotes: 3