Десериализация элементов и массивов - PullRequest
0 голосов
/ 26 ноября 2011

У меня проблема с десериализацией XML для моего класса.Он работал нормально, пока не поместил массив det в класс.

Я ставлю часы сразу после того, как происходит десериализация (data = Ctype (...)), и я вижу, что вся информация была загружена (ide, emit, dest) правильно, за исключением Элемент det : det , чей атрибут nItem = 1 загружен, но det , чей атрибут nItem = 2 не является.

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

Кто-нибудь предлагает?Спасибо!

Ниже описывается, где происходит десериализация при нажатии кнопки:

Protected Sub btnDes_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDes.Click
        Dim data As New nf

        'DeSerializacao XML
        Dim Deserializer As New Serialization.XmlSerializer(GetType(nf))
        Dim DataFile As New FileStream(Server.MapPath("App_Data\pedro.xml"), FileMode.Open, FileAccess.Read, FileShare.None)

        data = CType(Deserializer.Deserialize(DataFile), nf)
        DataFile.Close()
        DataFile.Dispose()

 End Sub

Ниже приведена часть моего XML-кода

<NF>
                <iNF>
                        <ide>
                                <cUF>31</cUF>                           
                        </ide>
                        <emit>                          
                                <xNome>Tradimaq  Ltda - MG</xNome>                              
                        </emit>
                        <dest>                          
                                <xNome>GEMAQUINAS LTDA</xNome>                          
                        </dest>
                        <det nItem="1">
                                <prod>
                                        <cProd>3.04.000000109</cProd>                                   
                                </prod>                         
                        </det>
                        <det nItem="2">
                                <prod>
                                        <cProd>3.01.580048839</cProd>                                   
                                </prod>

                        </det>

                </iNF>          
</NF>

Ниже приведена часть класса, который я создал для получения десериализации:

Public Class NF

    Public Property iNF As infNFe

    Public Sub New()


    End Sub

End Class
------------------------------------------------------------------------
Public Class iNF


    Public Sub New()

    End Sub

    Public Property ide As ide
    Public Property emit As emit
    Public Property avulsa_info As avulsa
    Public Property dest As dest

    Public Property det() As det


End Class
------------------------------------------------------------------------
Public Class det    

    <XmlElement("prod")> Public Property prod As prod

    Public Sub New()


    End Sub

End Class


Public Class prod

    Public Property cProd As String   

    Public Sub New()

    End Sub

End Class
------------------------------------------------------------------------

Public Class ide
    Public Property cUF As String
End Class

------------------------------------------------------------------------

Public Class emit
    Public Property xNome As String
End Class

------------------------------------------------------------------------

Public Class dest
    Public Property xNome As String
End Class

------------------------------------------------------------------------

1 Ответ

0 голосов
/ 26 ноября 2011

Изменить эту строку:

Public Property det() As det

в это:

<XmlElement("det")> Public Property det As det()

Хотя я не уверен, почему использование атрибута XmlElementAttribute будет работать, а его пропуск не удастся.

Обратите внимание, что

Property det() as det 

не является свойством массива det, паратезы используются для списка параметров, который в данном случае пуст. Для свойства массива вы должны будете поставить паратезы в конце:

Property det As det()
...