【问题标题】:Having Trouble Deserializing A Message反序列化消息时遇到问题
【发布时间】:2013-12-23 23:38:59
【问题描述】:

我在反序列化以下 XML 时遇到了一点问题。我可以很好地填充订单,但嵌套的包给我带来了一些困难。作为肥皂消息的消息在序列化之前被清除。我认为问题出在包标签中的 XSI 属性上?

请注意:以下 XML 来自 SOAP 消息,它是从 getSoapBody(string) 函数返回的。所有其他(大约 40 个)soap 响应都很好,它只是我遇到问题的双重嵌套 suff。

<?xml version="1.0" encoding="utf-8"?>
<Orders>
  <Order>
    <OrderNumber xsi:type="xsd:int">12345</OrderNumber>
    <Promotion xsi:type="xsd:string" />
    <Agent_Contact xsi:type="xsd:string" />
    <Packages>
        <Package>
          <OrderPackageType_ID xsi:type="xsd:int">1</OrderPackageType_ID>
          <Title_ID xsi:type="xsd:int">1</Title_ID>
          <StartIssue xsi:type="xsd:string">November 2010</StartIssue>
          <EndIssue xsi:type="xsd:string" />
        </Package>
        <Package>
          <OrderPackageType_ID xsi:type="xsd:int">2</OrderPackageType_ID>
          <Title_ID xsi:type="xsd:int">1</Title_ID>
          <StartIssue xsi:type="xsd:string">October 2010</StartIssue>
          <EndIssue xsi:type="xsd:string" />
         </Package>
      </Packages>      
    </Order>
    <Order> .... </Order>
</Orders>

反序列化的代码如下

        NameSpaceManager.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")

        'Initialize our parser context for the xsi namespace
        Context = New XmlParserContext(Nothing, NameSpaceManager, Nothing, XmlSpace.None)

        'Set up our reader settings
        ReaderSettings = New XmlReaderSettings()
        ReaderSettings.ConformanceLevel = ConformanceLevel.Fragment

        'getSoapBody(Response) rips out the env stuff and sets up for serialization this works
        'fine and I can populate all other SOAP messages fine. It just returns elements inside 
        'the SOAP response body
        Reader = XmlReader.Create(New StringReader(GetSoapBody(Response)), ReaderSettings, Context)

        If Deserializer.CanDeserialize(Reader) Then
            'Deserialize here
            ResponseObject = CType(Deserializer.Deserialize(Reader), U)
        Else
            Throw New SerializationException("Unable to deserialize class object")
        End If

订单很好地填充到我的订单类中,包什么也不返回?
我正在使用订单类中的包列表。

''' <remarks/>
<Serializable()> _
<XmlType("Order", AnonymousType:=True, NameSpace:="http://www.w3.org/1999/XMLSchema-instance")> _
Public Class Order
     'other memebers first
       .....
      'nested packed class declaration
       <XmlElement("Package", NameSpace:="http://www.w3.org/1999/XMLSchema-instance")> _
       Public Property Packages() As List(Of Package)
          Get
            If _Packages Is Nothing Then
               _Packages = New List(Of Package)
            End If
            Return _Packages
           End Get
           Set(ByVal value As List(Of Package))
             _Packages = value
           End Set
       End Property
End Class

我的包类是这样装饰的。

<Serializable()> _
<XmlType("Package", AnonymousType:=True, NameSpace:="http://www.w3.org/1999/XMLSchema-instance"> _
 Public Class Package 
         <XmlElementAttribute("OrderPackageType_ID", Form:=XmlSchemaForm.Unqualified, IsNullable:=True)> _
        Public Property OrderPackageType_ID() As NullableInt
          Get
            Return _OrderPackageType_ID
          End Get
          Set(ByVal value As NullableInt)
            _OrderPackageType_ID = value
          End Set
       End Property
        ....
 End Class

packages 类可以很好地填充以下 XML。但是作为嵌套元素,和上面一样,它返回空?

<?xml version="1.0" encoding="utf-8"?>
      <Packages>
        <Package>
          <OrderPackageType_ID xsi:type="xsd:int">1</OrderPackageType_ID>
          <Title_ID xsi:type="xsd:int">1</Title_ID>
          <StartIssue xsi:type="xsd:string">November 2010</StartIssue>
          <EndIssue xsi:type="xsd:string" />
        </Package>
        <Package>
          <OrderPackageType_ID xsi:type="xsd:int">2</OrderPackageType_ID>
          <Title_ID xsi:type="xsd:int">1</Title_ID>
          <StartIssue xsi:type="xsd:string">October 2010</StartIssue>
          <EndIssue xsi:type="xsd:string" />
         </Package>
     </Packages>      

任何帮助将不胜感激,希望我为您提供了足够的信息。

问候...

【问题讨论】:

    标签: xml soap nested deserialization


    【解决方案1】:

    我想我最好回答这个问题,我不久前找到了答案。我需要正确地装饰属性和类,如下所示。这解决了我的问题。

        <System.Xml.Serialization.XmlArrayAttribute(Form:=System.Xml.Schema.XmlSchemaForm.Unqualified)> _
    <System.Xml.Serialization.XmlArrayItemAttribute("Package", GetType(Package), Form:=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable:=True)> _
        Public Property Packages() As Package()
            Get
                Return _Packages
            End Get
            Set(ByVal value As Package())
                _Packages = value
            End Set
        End Property
    End Class
    
    
    <System.Xml.Serialization.XmlRoot("Package")> _
    Public Class Package
    ....
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2020-10-20
      • 2011-06-30
      相关资源
      最近更新 更多