Giedrius
Giedrius

Reputation: 8540

XmlSerializer null reference exception appears in .NET 4.0 but not in .NET 4.5

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

Answers (1)

Scoregraphic
Scoregraphic

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

Related Questions