Error when deserializing xml to an object: System.FormatException Input String was not in correct format

c#, silverlight, xml, xml-deserialization, xml-serialization

Solution

The problem is that the property `GroupID` is declared as an integer, but its value is empty (`<GroupID/>`). One solution is to change the XML so that the value for that element is a valid integer:

<GroupID>0</GroupID>

Another solution would be to deserialize that value as a string, and convert to an integer which users of the type may consume:

    [XmlRoot("Server")]
    public class RegisterServerObject
    {
        public RegisterServerObject() { }

        public int ServerID { get; set; }

        [XmlIgnore]
        public int GroupID { get; set; }
        [XmlElement(ElementName = "GroupID")]
        public string GroupIDStr
        {
            get
            {
                return this.GroupID.ToString();
            }
            set
            {
                if (string.IsNullOrEmpty(value))
                {
                    this.GroupID = 0;
                }
                else
                {
                    this.GroupID = int.Parse(value);
                }
            }
        }

        public int ParentID { get; set; }

        public string ServerName { get; set; }

        public string User { get; set; }

        public int Uid { get; set; }

        public string Domain { get; set; }

        public string Location { get; set; }

        [XmlArray(ElementName = "AssociatedModules")]
        [XmlArrayItem(ElementName = "Module")]
        public List<RegisterModuleObject> AssociatedModules { get; set; }
    }

    public class RegisterModuleObject
    {
        public int ModId { get; set; }
        public int ServerId { get; set; }
        public string ModName { get; set; }
        public int ModuleStatus { get; set; }
    }

Problem

Hello and thanks in advance for the help. I am having an issue when trying to deserialize an XElement into an object using an XmlSerializer and a StringReader. My code to deserialize is this: ``` /*deseierialize a single RegisterServerObject instance from xml*/ static RegisterServerObject DeserializeSingleServerFromXml(XElement serverElement) { XmlSerializer deserializer = new XmlSerializer(typeof(RegisterServerObject)); RegisterServerObject server; using (var reader = new StringReader(serverElement.ToString())) server = (RegisterServerObject)deserializer.Deserialize(reader); return server; } ``` I know the contents of the reader as revealed by the exception are: ``` <Server> <ServerID>11</ServerID> <GroupID /> <ParentID>15</ParentID> <ServerName>IAProd1</ServerName> <User>admin</User> <UID>123</UID> <PWD>password</PWD> <Domain>InputAccel</Domain> <Location>Left</Location> <AssociatedModules> <Module> <ModId>1</ModId> <ServerId>11</ServerId> <ModName>TestModA</ModName> <ModuleStatus>1</ModuleStatus> </Module> <Module> <ModId>2</ModId> <ServerId>11</ServerId> <ModName>TestModB</ModName> <ModuleStatus>1</ModuleStatus> </Module> <Module> <ModId>9</ModId> <ServerId>11</ServerId> <ModName>TestModI</ModName> <ModuleStatus>1</ModuleStatus> </Module> <Module> <ModId>10</ModId> <ServerId>11</ServerId> <ModName>TestModJ</ModName> <ModuleStatus>1</ModuleStatus> </Module> </AssociatedModules> </Server> ``` And my RegisterServerObject class looks like the following: ``` [XmlRoot("Server")] public class RegisterServerObject { public RegisterServerObject() { } public int ServerID { get; set; } public int GroupID { get; set; } public int ParentID { get; set; } public string ServerName { get; set; } public string User { get; set; } public int Uid { get; set; } public string Domain { get; set; } public string Location { get; set; } public List<RegisterModuleObject> AssociatedModules { get; set; } } ``` And at the risk of information overload the exact exception message I am getting is this: ``` System.InvalidOperationException: There is an error in XML document (4, 4). ---> System.FormatException: Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) at System.Xml.XmlConvert.ToInt32(String s) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderRegisterServerObject.Read3_RegisterServerObject(Boolean isNullable, Boolean checkType) at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderRegisterServerObject.Read4_Server() --- End of inner exception stack trace --- at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, Object events) at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle) at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader) at SL_xMonitor_Frontend_RefactorV1.Views.RegisteringNewChildWindowV2.DeserializeSingleServerFromXml(XElement serverElement) at SL_xMonitor_Frontend_RefactorV1.Views.RegisteringNewChildWindowV2.modXmlClient_getAssociatedModulesCompleted(Object sender, getAssociatedModulesCompletedEventArgs e) at SL_xMonitor_Frontend_RefactorV1.XMLServersAndModulesServiceReference.XMLTablesAndModulesServiceClient.OngetAssociatedModulesCompleted(Object state)} ``` It seems there is an issue with converting the value of an xml element, ParentID maybe, into an int in order to instantiate the class, but I am not sure why that would be. Thank you in advance for the help!

Original source