Usuário com melhor resposta
Serializar uma propriedade que é um array

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.
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
- Marcado como Resposta themartians terça-feira, 2 de abril de 2013 13:33
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
- Marcado como Resposta themartians terça-feira, 2 de abril de 2013 13:33
-