none
Serializar uma propriedade que é um array RRS feed

  • Pergunta

  • Olá,

    Boa tarde a todos, sou novo em VB.NET e tenho uma dúvida que me empacou o dia de trabalho de hoje. Eu tenho um objeto de nome "estator" onde constam alguns membros de dados. Um desses membro de dados é um vetor onde consta o número de enrolamentos por ranhura - cada ranhura é representada por um índice. Esse número de enrolamentos/ ranhura é definido pelo usuário. Ex:

    Ranhura 1 - 5 enrolamentos

    Ranhura 2 - 6 enrolamentos

    Ranhura n - ... enrolamentos

    Esse número de enrolamentos/ ranhura é definido pelo usuário. Até aí, ok. O problema é quando eu vou serializar esse objeto. Aparentemente, isso o VB.NET não faz. Quando vou abrir o .XML gerado, essa propriedade do meu objeto simplesmente não aparece.

    Em um fórum gringo, esbarrei em um problema similar e informaram para usar um List. Tentei e mesmo assim não deu certo. Alguém tem uma idéia ?

    Segue o código da minha propriedade:

        Property numERPr(ByVal i As Integer) As Integer
            Get
                Return numERP(i)
            End Get
            Set(value As Integer)
                numERP(i) = value
            End Set
        End Property

    Segue o meu código para serializar:

        Private Sub menSal_Click(sender As System.Object, e As System.EventArgs) Handles menSal.Click
            Dim objStreamWriter As New StreamWriter("C:\Product.xml")
            Dim x As New XmlSerializer(GetType(classMotor))
            x.Serialize(objStreamWriter, motor)
            objStreamWriter.Close()
        End Sub

     *Acho que vale constar que o meu objeto está ok quando eu debuggo o  programa. Isto é, o membro de dados vetorial do objeto referido se encontra com o número de ranhuras e o número de enrolamentos/ranhura advindos do usuário corretamente. O problema é mesmo na serialização.

    Agradeço desde já.

    Att,

    Ricardo S.


    segunda-feira, 1 de abril de 2013 21:21

Respostas

  • Olá,

    O XmlSerializer não serializa membros private. Se seu array estiver declarado assim Private _Arr As Integer() não será serializado. Ele deve ser declarado como membro Público. Veja o exemplo que eu fiz:

    Imports System.Xml.Serialization
    Imports System.IO
    <Serializable()> _
    Public Class Exemplo
        Private _array() As Integer
        Private _NomeDoExemplo As String
        Public Sub New()
            _array = {1, 2, 3, 4, 5}
            _NomeDoExemplo = "Exemplo Forum MSDN"
        End Sub
        Public Property MeuArray As Integer()
            Get
                Return _array
            End Get
            Set(value As Integer())
                _array = value
            End Set
        End Property
        Public Property ItemDoArray(ByVal i As Integer) As Integer
            Get
                Return _array(i)
            End Get
            Set(value As Integer)
                _array(i) = value
            End Set
        End Property
        Public Property NomeDoExemplo As String
            Get
                Return _NomeDoExemplo
            End Get
            Set(value As String)
                _NomeDoExemplo = value
            End Set
        End Property
        Public Sub MeSerializar(NomeDoArquivo As String)
            Dim sw As New StreamWriter(NomeDoArquivo, False)
            Dim xs As New XmlSerializer(GetType(Exemplo))
            xs.Serialize(sw, Me)
            sw.Close()
        End Sub
        Public Shared Function DeSerializar(NomeDoArquivo As String) As Exemplo
            Dim sw As New StreamReader(NomeDoArquivo, False)
            Dim xs As New XmlSerializer(GetType(Exemplo))
            Dim obj As Object
            obj = xs.Deserialize(sw)
            sw.Close()
            Return obj
        End Function
    End Class
    

    Sem a propriedade MeuArray o array não foi serializado pois o array foi declarado como private. Mas acrescentado a propriedade ou declarando como Público ele foi serializado. Você pode declarar seu array como público e usar o atributo EditorBrowsable para oculta-lo no editor do vs:

     <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _
        Public _array() As Integer


    Herbert Lausmann

    Gerenciador de Logins

    • Marcado como Resposta themartians terça-feira, 2 de abril de 2013 13:33
    terça-feira, 2 de abril de 2013 10:42

Todas as Respostas

  • Olá,

    O XmlSerializer não serializa membros private. Se seu array estiver declarado assim Private _Arr As Integer() não será serializado. Ele deve ser declarado como membro Público. Veja o exemplo que eu fiz:

    Imports System.Xml.Serialization
    Imports System.IO
    <Serializable()> _
    Public Class Exemplo
        Private _array() As Integer
        Private _NomeDoExemplo As String
        Public Sub New()
            _array = {1, 2, 3, 4, 5}
            _NomeDoExemplo = "Exemplo Forum MSDN"
        End Sub
        Public Property MeuArray As Integer()
            Get
                Return _array
            End Get
            Set(value As Integer())
                _array = value
            End Set
        End Property
        Public Property ItemDoArray(ByVal i As Integer) As Integer
            Get
                Return _array(i)
            End Get
            Set(value As Integer)
                _array(i) = value
            End Set
        End Property
        Public Property NomeDoExemplo As String
            Get
                Return _NomeDoExemplo
            End Get
            Set(value As String)
                _NomeDoExemplo = value
            End Set
        End Property
        Public Sub MeSerializar(NomeDoArquivo As String)
            Dim sw As New StreamWriter(NomeDoArquivo, False)
            Dim xs As New XmlSerializer(GetType(Exemplo))
            xs.Serialize(sw, Me)
            sw.Close()
        End Sub
        Public Shared Function DeSerializar(NomeDoArquivo As String) As Exemplo
            Dim sw As New StreamReader(NomeDoArquivo, False)
            Dim xs As New XmlSerializer(GetType(Exemplo))
            Dim obj As Object
            obj = xs.Deserialize(sw)
            sw.Close()
            Return obj
        End Function
    End Class
    

    Sem a propriedade MeuArray o array não foi serializado pois o array foi declarado como private. Mas acrescentado a propriedade ou declarando como Público ele foi serializado. Você pode declarar seu array como público e usar o atributo EditorBrowsable para oculta-lo no editor do vs:

     <System.ComponentModel.EditorBrowsable(ComponentModel.EditorBrowsableState.Never)> _
        Public _array() As Integer


    Herbert Lausmann

    Gerenciador de Logins

    • Marcado como Resposta themartians terça-feira, 2 de abril de 2013 13:33
    terça-feira, 2 de abril de 2013 10:42
  • Olá,

    Muito obrigado Herbert. Simples, legível e preciso. Nota 10 para você.

    Att,

    Ricardo S.

    terça-feira, 2 de abril de 2013 13:34