Ошибка при десериализации xml для объекта: System.FormatException Входная строка не была в правильном формате
Привет и спасибо за помощь.
У меня возникла проблема при попытке десериализации XElement в объект с помощью XmlSerializer и StringReader. Мой код для десериализации:
/*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;
}
Я знаю, что содержание читателя, как видно из исключения, следующее:
<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>
И мой класс RegisterServerObject выглядит следующим образом:
[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; }
}
И при опасности перегрузки информации точное сообщение об ошибке, которое я получаю, следующее:
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)}
Кажется, есть проблема с преобразованием значения элемента xml, возможно, ParentID, в int, чтобы создать экземпляр класса, но я не уверен, почему это было бы. Заранее спасибо за помощь!
Ответы
Ответ 1
Проблема заключается в том, что свойство GroupID
объявляется как целое число, но его значение пусто (<GroupID/>
). Одним из решений является изменение XML, так что значение для этого элемента является действительным целым числом:
<GroupID>0</GroupID>
Другим решением было бы десериализовать это значение как строку и преобразовать в целое число, которое пользователи этого типа могут потреблять:
[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; }
}
Ответ 2
Сначала вам нужно установить атрибут XmlIgnore
для свойства GroupID
[XmlRoot("Server")]
public class RegisterServerObject
{
. . .
[XmlIgnore]
public int GroupID { get; set; }
. . .
}
то вы можете создать адаптер, который вы будете использовать для десериализации:
[XmlRoot("Server")]
public class RegisterServerObjectAdapter : RegisterServerObject
{
[XmlElement("GroupID")]
public string GroupIDNew
{
get { return GroupID.ToString(); }
set
{
int outInt;
int.TryParse(value, out outInt);
GroupID = outInt;
}
}
}
и finaly Я немного изменил метод DeserializeSingleServerFromXml
static RegisterServerObject DeserializeSingleServerFromXml(XDocument serverElement)
{
var deserializer = new XmlSerializer(typeof(RegisterServerObjectAdapter));
return (RegisterServerObject)deserializer.Deserialize(serverElement.CreateReader(ReaderOptions.OmitDuplicateNamespaces));
}
Ответ 3
Может быть, у GroupID есть проблемы. Поскольку никакого значения для GroupID не предусмотрено, я считаю, что он пытается передать его как string.Empty
, который, очевидно, не будет установлен в свойство int
.
Вы можете попробовать следующее:
[XmlIgnore]
public int GroupID
{
get { !string.IsNullOrEmpty(GroupIDAsText) ? int.Parse(GroupIDAsText) : 0; }
set { GroupID = value; }
}
[XmlAttribute("GroupID")
public int GroupIDAsText { get; set; }
.