【问题标题】:Exception occurs when deserializing the following XML (from REST service), for no reason!反序列化以下 XML(来自 REST 服务)时发生异常,无缘无故!
【发布时间】:2011-06-28 09:57:26
【问题描述】:

我无法找到以下 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 也无法解决此问题。还有其他想法吗?

【问题讨论】:

  • 我的猜测是T 中接收DiscountRate 的字段是整数类型,而不是浮点类型。如果不能看到 T 类的代码,就无法确定。
  • DiscountRate 是 Decimal 类型,所以应该没问题。它只是上面失败了,其他 XML 似乎很好。我不知道为什么它会为此解析为 int。
  • XML 是否来自网络连接?
  • 它来自 REST 服务,所以是的。响应通常会毫无问题地发送 - 只有这个我有问题。
  • 既然 XML 很好,接下来想到的就是您从 REST 服务获得的响应不完整。仔细检查一下,也许响应没有一次性完成。

标签: .net vb.net exception-handling xml-serialization deserialization


【解决方案1】:

关于 XML 错误行号和列号的非常重要的说明: XML声明不计为一行,所以位置(0,0) 在您的文件中实际上是第二行,而不是带有声明的行

编辑:抱歉,我的意思是,如果异常表明 (23, 26) 有问题,它实际上是 (24,26)。

【讨论】:

    【解决方案2】:

    作为一种解决方法,您可以将 DiscountRate 的类型从 decimal 更改为 double 并查看它是否有效,它占用的内存更少,对于像折扣率这样的业务实体应该足够了。

    【讨论】:

    • 谢谢。但我试过了,它没有任何区别。 :( - 记忆评论 +1 :)
    • 只有一个其他十进制属性。不过,我认为这不是问题,因为其他返回的 XML(作为相同的对象类型)反序列化没有问题。这让我觉得有奇怪的字符,但我看不到任何字符。内部异常堆栈跟踪也指向 tryparseint32 方法是问题,因为它应该尝试解析双精度(或十进制)
    【解决方案3】:

    原来问题出在属性上,但是,我正忙着查看错误消息的内容,我错过了。错误消息指向了错误的属性!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 2020-01-10
      • 2014-10-22
      • 2014-12-22
      相关资源
      最近更新 更多