Исключение возникает при десериализации следующего XML (из службы REST) ​​без всякой причины!

У меня возникли проблемы с поиском, почему следующий XML не будет десериализоваться.

Сообщение:

Ошибка в документе XML (23, 26).

Внутреннее исключение:

Входная строка имела неверный формат.

Код вызова (работает без проблем во всем, кроме приведенного ниже XML):

Public Shared Function DeserializeObject(Of T)(ByVal serializedXml As String) As T
    Dim serializer As New XmlSerializer(GetType(T))

    Using strReader As New IO.StringReader(serializedXml)
        Return DirectCast(serializer.Deserialize(strReader), T)
    End Using

End Function

XML (выглядит нормально - проблема после первой открытой квадратной скобки DiscountCode):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyResponse>
    <Shoppinglist>
        <ShoppinglistName>ShoppingListName</ShoppinglistName>
        <Currency>GBP</Currency>
        <PriceType>Retail</PriceType>
        <Orders>
            <Order>
                <OrderLineId>Test</OrderLineId>
                <Completed>false</Completed>
                <Description>Other Item</Description>
                <Quantity>1</Quantity>
                <Parts>
                    <Part>
                        <PartId>43543543435</PartId>
                        <Description>Cylinder Assy - Master</Description>
                        <PriceInclTax>92.16</PriceInclTax>
                        <PriceExclTax>76.8</PriceExclTax>
                        <Quantity>1</Quantity>
                        <TaxRate>20.0</TaxRate>
                        <NetDiscountCode>ZZ</NetDiscountCode>
                        <SurchargeQuantity>1.0</SurchargeQuantity>
------------->          <DiscountRate>0.0</DiscountRate>
                    </Part>
                </Parts>
            </Order>
        </Orders>
    </Shoppinglist>
    <ReturnCode>1</ReturnCode>
    <StatusMessage>Open tasks exist</StatusMessage>
</MyResponse>

Кто-нибудь может увидеть, что не так?

Трассировка стека (для внешнего исключения):

 at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
 at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)

Трассировка стека для внутреннего исключения:

 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)    

Что странно, так как похоже, что он анализируется в Int, когда он должен анализироваться в десятичном виде...

свойство для класса T:

Protected _DiscountRate As Decimal
Public Property DiscountRate() As Decimal
    Get
        Return _DiscountRate
    End Get
    Set(ByVal Value As Decimal)
        _DiscountRate = Value
    End Set
End Property

Я добавил следующее, но это не имело никакого значения:

<System.Xml.Serialization.XmlElement(Type:=GetType(Decimal))> _

Я сомневаюсь, что это связано со странными персонажами, поскольку я их не вижу. Также изменение типа на Double не решает проблему. Любые другие идеи?


person Mr Shoubs    schedule 28.06.2011    source источник
comment
Я предполагаю, что поле в T, которое получает DiscountRate, является интегральным типом, а не типом с плавающей запятой. Невозможно сказать наверняка, не видя кода класса T.   -  person Cody Gray    schedule 28.06.2011
comment
DiscountRate — это тип Decimal, так что все должно быть в порядке. Это только вышеперечисленное, но с другим XML все в порядке. Я не знаю, почему это будет анализировать int для этого.   -  person Mr Shoubs    schedule 28.06.2011
comment
Приходит ли XML из сетевого подключения?   -  person Matt Ellen    schedule 28.06.2011
comment
Это исходит от службы REST, так что да. Ответ обычно отправляется без проблем - проблема только с этим.   -  person Mr Shoubs    schedule 28.06.2011
comment
Поскольку XML хорош, следующее, что приходит на ум, это то, что вы получаете неполный ответ от службы REST. Дважды проверьте это, возможно, ответ просто не проходит за один раз.   -  person Matt Ellen    schedule 28.06.2011
comment
Я использовал fiddler для просмотра необработанных данных... кажется, что проблема может быть в элементе в строке выше... интересно, почему он сообщил о строке, которую он сделал...??? расследует и обновит мой вопрос.   -  person Mr Shoubs    schedule 29.06.2011


Ответы (3)


ОЧЕНЬ важное замечание о номерах строк и столбцов ошибок XML: объявление XML не считается строкой, поэтому позиция (0,0) в вашем файле на самом деле является второй строкой, а не строкой с объявлением.

РЕДАКТИРОВАТЬ: извините, я хочу сказать, что если в исключении говорится, что что-то не так в (23, 26), это на самом деле в (24,26).

person Captain Kenpachi    schedule 04.01.2013

В качестве обходного пути вы можете изменить тип DiscountRate с decimal на double и посмотреть, работает ли он, занимает меньше памяти и должно быть достаточно для такого бизнес-объекта, как ставка дисконтирования.

person sll    schedule 28.06.2011
comment
Спасибо. Но я попробовал это, и это не имело никакого значения. :( - +1 за комментарий памяти :) - person Mr Shoubs; 28.06.2011
comment
Есть только одно другое десятичное свойство. Я не думаю, что это проблема, поскольку другой XML, который возвращается (как тот же тип объекта), десериализуется без проблем. Это заставляет меня думать, что есть странные персонажи, но я их не вижу. Кроме того, внутренняя трассировка стека исключений указывает на то, что метод tryparseint32 является проблемой, поскольку он должен пытаться разобрать двойное (или десятичное) число. - person Mr Shoubs; 28.06.2011

Оказывается, проблема была со свойством, однако я был так занят просмотром сообщения об ошибке, что пропустил его. Сообщение об ошибке указывает на неправильное свойство!

person Mr Shoubs    schedule 04.07.2011