#c# #xml #visual-studio
#c# #xml #visual-studio
Вопрос:
Я пытаюсь десериализовать XML-файл и получаю сообщение об ошибке, которое гласит:
System.InvalidOperationException: There is an error in XML document (200, 67). ---> System.ArgumentOutOfRangeException: Index and length must refer to a location within the string.
Parameter name: length
Я использую этот код для десериализации документа.
public static object DeserializeFromXmlFile(FileInfo srcFile, Type type)
{
XmlSerializer xmlSerializer = new XmlSerializer(type);
using (XmlReader reader = XmlReader.Create(srcFile.FullName))
{
return xmlSerializer.Deserialize(reader);
}
}
Это всегда приводит к сбою в одних и тех же строках — в этом примере всего 63 символа, но перед ним есть две вкладки, так что я предполагаю, что длина строки составляет 66 символов, а десериализатор пытается прочитать 67 символов из строки!
<printorder_delivery_location>FOB</printorder_delivery_location>
Общим для всех строк сбоя является то, что значение <printorder_delivery_location>
тега меньше 10 символов. Если я добавлю дополнительные символы (даже если это просто пробел), все будет работать нормально.
<printorder_delivery_location>FOB Hong Kong</printorder_delivery_location>
Я настроил Notepad на отображение скрытых символов, и, похоже, в <printorder_delivery_location>
строках нет ничего неправильного.
Как вы можете видеть, есть также строки, которые короче, чем <printorder_delivery_location>
строка, но это не приводит к сбою десериализатора.
Что-нибудь, что я могу проверить, чтобы попытаться решить эту проблему?
Комментарии:
1. Вы не показываете классы модели, которые необходимы для десериализации. Есть ли там какой-либо пользовательский код сериализации?
2. Да, есть @Dbuggy — сейчас я опубликовал ответ. Глупая ошибка с моей стороны.
Ответ №1:
Как только я сообщил об этом, я понял проблему.
Объект, в который я десериализовывал, использовал Substring()
метод сокращения <printorder_delivery_location>
до 10 символов. В случаях, когда они имели длину менее 10 символов, это приводило к сбою, потому что, очевидно, индекс был вне диапазона.
Все, что мне нужно было сделать, это добавить проверку, чтобы убедиться, что длина местоположения доставки была больше 10 символов, прежде чем пытаться получить подстроку.
[XmlElement("printorder_delivery_location")]
public string DeliveryLocation
{
get => deliveryLocation;
set
{
if (value.Length > 10)
deliveryLocation = value.Substring(0,10).ToUpper();
else
deliveryLocation = value.ToUpper();
}
}
Комментарии:
1. Похоже, что проверка схемы не выполняется. Должна быть веская причина, по которой для схемы требуется 10 символов.