Есть ли способ определить, какой элемент вызывает ошибку десериализации в .net - PullRequest
0 голосов
/ 21 июня 2019

Я импортирую данные в нашу программу.У меня есть таблица стилей, которая преобразует входящие данные в соответствии с нашей структурой сущностей.Я получаю сообщение об ошибке при десериализации преобразованных данных в нашу структуру сущностей.Данные в одном или нескольких полях имеют неправильный формат, либо пустые логические или символьные данные, пытающиеся перейти в числовое поле.Сущность довольно велика, и сложно отследить конкретное поле.

Я хотел бы знать, есть ли ссылка в объекте исключения, который я могу использовать для отслеживания рассматриваемого поля.

Вот сообщение об ошибке и трассировка стека:

There is an error in the XML document.

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.XmlSerializationReaderCrashEntity.Read28_CrashNamesEntity(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCrashEntity.Read29_CrashEntity(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCrashEntity.Read30_CrashEntity()
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
   at XMLUtility.DeserializeObject(String XML, Type ObjectType) in XMLUtility.cs:line 155
   at DirectoryFramework.ImportData() in DirectoryFramework.cs:line 344

1 Ответ

0 голосов
/ 21 июня 2019

Мне удалось найти плохих актеров.Я использовал цикл for, потому что я знаю, сколько пустых элементов у меня было, но вы можете вместо этого использовать цикл while и переходить к EOF.

string myXML = outputXml;

int startIndex = 1;
int endIndex = 0;
int insertAt = 0;
string fldLIst = "";
for (int i = 0; i < 98; i++)
{
    insertAt = myXML.IndexOf("></", startIndex) + 1;
    startIndex = insertAt + 2;
    endIndex = myXML.IndexOf(">", startIndex);
    string myElement = myXML.Substring(startIndex, endIndex - startIndex);
    myXML = myXML.Insert(insertAt, "-9" );
    try
    {
        importedEntity = XMLUtility.DeserializeObject(myXML, entType);
        fldLIst += myElement + "\r\n";
    }
    catch (Exception ex)
    {
        Console.WriteLine(myElement);
    }
}
Console.WriteLine("---------\r\n" + fldLIst);  // The first element here is the one that caused the problem.

Как только я узнал, какой элемент был плохим, я изменил таблицу стилейпроверить пустую строку и вернуть 0, если она была пустой.Кстати, может быть несколько пустых элементов, которые вызывают проблему, и вам придется повторять этот процесс, пока все элементы не будут обработаны.

...