Не удается отследить источник ошибки при разборе файла XML - PullRequest
0 голосов
/ 02 июня 2011

Это код:

   var serializer = new DataContractSerializer(typeof(QuoteAndOfferCollection));
    try
    {
        using (var file = File.OpenRead(filename))
        {
            offers = (QuoteAndOfferCollection)serializer.ReadObject(file);
        }
    }
    catch (SerializationException sex)
    {
        File.AppendAllText(log, "Deserialization failed - " + sex);
        return;
    }

И вот ошибка, которую я получаю:

xmlDeserialization failed - System.Runtime.Serialization.SerializationException: There was an error deserializing the object of type Services.Dto2.QuoteAndOfferCollection. The value '' cannot be parsed as the type 'Int32'. ---> System.Xml.XmlException: The value '' cannot be parsed as the type 'Int32'. ---> 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 System.Xml.XmlConverter.ToInt32(String value)

Я не могу отследить часть '' .

1 Ответ

0 голосов
/ 02 июня 2011

Перехватите исключение и получите значение file.Position.Это даст вам некоторое представление о том, где в файле находится оскорбительная строка.Вы можете сделать это лучше, если обернуть пользовательский поток вокруг FileStream и следить за количеством прочитанных строк.

Вы также можете создать XmlReader и передать его ReadObject.Когда вы поймаете исключение, изучите свойства читателя.Он может точно сказать, в какой строке произошла ошибка.

Но вам нужно переместиться туда, где перехватывается исключение.То есть вместо:

try
{
    using (stream)
    {
        // deserialize
    }
}
catch
{
}

вы хотите написать:

using (stream)
{
    try
    {
        // deserialize
    }
    catch
    {
    }
}
...