none
Como Abrir, Editar e Adicionar dados em ARQUIVO BINÁRIO numa STRUCTURE em VB .NET?

    Question

  • Como Abrir, Editar e Adicionar dados em ARQUIVO BINÁRIO numa STRUCTURE em VB .NET?

    Caros colegas, criei uma estrutura para conter algumas pessoas e estou salvando num arquivo binário chamado PESSOAS.BIN. Até este ponto para salvar e abrir o arquivo para LEITURA tudo bem. Porém, quando tento abrir o arquivo para edição, estou tendo problemas. Ocorre uma exceção: “O fluxo não era legível.”

    Preciso da ajuda de vcs para que eu possa implementar o código abaixo para que, quando eu adicionar novas pessoas, estas sejam acrescentadas no final das já existentes no arquivo PESSOAS.BIN. Pois do jeito que o código se encontra, se eu adicionar novas pessoas e salvar o arquivo, o programa irá salvar somente as últimas adições como um arquivo novo, fazendo com que as outras pessoas cadastradas sejam perdidas.

    As duas rotinas para SALVAR E ABRIR são:

     

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

    Imports System.IO

    Imports System.Runtime.Serialization.Formatters.Binary

     

    Public Class frmCadastro

        <Serializable()> Structure Pessoa

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

     

    Sub SalvarArquivo()

            Dim Arquivo As FileStream

            Arquivo = File.Create("..\..\..\Pessoas.BIN")

            Arquivo.Seek(0, SeekOrigin.End)

     

            Dim Formato As BinaryFormatter = New BinaryFormatter()

            Formato.Serialize(Arquivo, aPessoas)

      'aPessoas é o Array do tipo Pessoas

     

            Arquivo.Close()

            Formato = Nothing

        End Sub

     

    Sub AbrirArquivo()

            Dim Arquivo As FileStream

            Arquivo = File. OpenRead("..\..\..\Pessoas.BIN")

            'Se eu usar o File.OpenWrite Ocorre a exceção: “O fluxo não era legível.”

         

            Dim Formato As New BinaryFormatter

            aPessoas = Formato.Deserialize(Arquivo)

     

            Arquivo.Close()

            Formato = Nothing

     

            MostraPessoa(Indice)

        End Sub

     

    Agradeceria se postassem respostas baseadas em código de exemplo.

    Ficarei mt grato por quem se dispor a ajudar-me.

    Edival

    Friday, October 16, 2009 4:31 PM

Answers

  • Olá Edival...

    Segue um exemplo de serialização de objetos espero que te ajude simulei a sua situação e aqui deu certo.

    Faça as devidas adaptações para o seu código que vai dar certo

    qualquer dúvida me pergunte

    Imports System.IO
    Imports System.Runtime.Serialization
    Imports System.Runtime.Serialization.Formatters.Binary
    
    Public Class Form1
    
        Dim car(0) As car
    
        Private Sub ButtonSerialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSerialize.Click
    
            ReDim Preserve car(car.GetUpperBound(0) + 1)
    
            car(car.GetUpperBound(0)) = New car
    
            car(car.GetUpperBound(0)).brand = "Renault"
            car(car.GetUpperBound(0)).model = "Clio Sedan"
            car(car.GetUpperBound(0)).color = "Black"
            car(car.GetUpperBound(0)).passengers = 4
    
            Dim fs As New FileStream("test_serialize.dat", FileMode.Create)
    
            Dim bf As New BinaryFormatter
    
            bf.Serialize(fs, car)
    
            fs.Close()
    
            LabelOutput.Text = "The object was serializable"
    
        End Sub
    
        Private Sub ButtonDeserialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDeserialize.Click
    
            Dim fs = New FileStream("test_serialize.dat", FileMode.Open)
    
            Dim bf As BinaryFormatter = New BinaryFormatter
    
    
            
            car = CType(bf.Deserialize(fs), car())
    
            fs.Close()
    
            LabelOutput.Text = ""
    
            For i = 1 To car.GetUpperBound(0)
                LabelOutput.Text &= car(i).brand.ToString & " / " & car(i).model.ToString & " / " & car(i).color.ToString & " / " & CStr(car(i).passengers) & vbCrLf
            Next
    
        End Sub
    
    End Class
    
    <Serializable()> Public Class car
        Public brand As String
        Public model As String
        Public color As String
        Public passengers As Integer
    End Class
    

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
    • Marked as answer by Edival Monday, October 19, 2009 9:13 PM
    Saturday, October 17, 2009 12:56 AM
  • Oi,

    Da forma como está explicando, parece mais um problema da página no processo de edição do que da serialização.

    Se você tem uma coleção x que leu de um arquivo, adiciona um item na coleção x, serializa e grava novamente sobre o mesmo arquivo, os dados estarão lá.

    Me parece que sua aplicação pode estar fazendo algo errado nesta sequencia.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marked as answer by Edival Monday, October 19, 2009 4:15 PM
    Monday, October 19, 2009 12:46 PM
  • Oi,

    É uma questão de mudança de ponto de vista : Isso não existe no processo de serialização/deserialização - edição continuada do arquivo.

    Quando você deserializa no inicio da aplicação para ler os dados, você passa a ter um objeto .NET e irá editar este objeto .NET. Feche e esqueça o arquivo.

    Quando você terminar, irá serializar o objeto .NET novamente - depois de editado - e gravar por cima do arquivo antigo.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marked as answer by Edival Monday, October 19, 2009 4:14 PM
    Monday, October 19, 2009 2:48 PM

All replies

  • Olá Edival...

    Segue um exemplo de serialização de objetos espero que te ajude simulei a sua situação e aqui deu certo.

    Faça as devidas adaptações para o seu código que vai dar certo

    qualquer dúvida me pergunte

    Imports System.IO
    Imports System.Runtime.Serialization
    Imports System.Runtime.Serialization.Formatters.Binary
    
    Public Class Form1
    
        Dim car(0) As car
    
        Private Sub ButtonSerialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSerialize.Click
    
            ReDim Preserve car(car.GetUpperBound(0) + 1)
    
            car(car.GetUpperBound(0)) = New car
    
            car(car.GetUpperBound(0)).brand = "Renault"
            car(car.GetUpperBound(0)).model = "Clio Sedan"
            car(car.GetUpperBound(0)).color = "Black"
            car(car.GetUpperBound(0)).passengers = 4
    
            Dim fs As New FileStream("test_serialize.dat", FileMode.Create)
    
            Dim bf As New BinaryFormatter
    
            bf.Serialize(fs, car)
    
            fs.Close()
    
            LabelOutput.Text = "The object was serializable"
    
        End Sub
    
        Private Sub ButtonDeserialize_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDeserialize.Click
    
            Dim fs = New FileStream("test_serialize.dat", FileMode.Open)
    
            Dim bf As BinaryFormatter = New BinaryFormatter
    
    
            
            car = CType(bf.Deserialize(fs), car())
    
            fs.Close()
    
            LabelOutput.Text = ""
    
            For i = 1 To car.GetUpperBound(0)
                LabelOutput.Text &= car(i).brand.ToString & " / " & car(i).model.ToString & " / " & car(i).color.ToString & " / " & CStr(car(i).passengers) & vbCrLf
            Next
    
        End Sub
    
    End Class
    
    <Serializable()> Public Class car
        Public brand As String
        Public model As String
        Public color As String
        Public passengers As Integer
    End Class
    

    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
    • Marked as answer by Edival Monday, October 19, 2009 9:13 PM
    Saturday, October 17, 2009 12:56 AM
  • Edival

    tenha utilizar o sua procedure de escrita no arquivo da seguinte maneira e ver se atende ao que você estar querendo fazer.

     

    Sub SalvarArquivo()
    Dim Arquivo As New FileStream("..\..\..\Pessoas.BIN", FileMode.OpenOrCreate, FileAccess.Write)
    Dim escrita As New StreamWriter(Arquivo, Text.Encoding.ASCII)
    Dim Formato As BinaryFormatter = New BinaryFormatter()
    

    Formato.Serialize(Arquivo, aPessoas) 'aPessoas o Array do tipo Pessoas
    Arquivo.Close() escrita.Close() Formato = Nothing End Sub

     

     


    Klayton Gomes MCP /MCTS/ MCPD Analist System / Software Developer
    Sunday, October 18, 2009 11:38 PM
  • Oi,

    Utilizando os método Serialize e Deserialize do Binaryformatter o que você terá é um objeto do .NET transformado em arquivo e vice-versa.

    Quando desejar editar algo, abra o arquivo, faça o deserialize (terá o objeto do .NET inteiro), edite o que deseja e faça o serialize novamente, gravando o arquivo por cima do existente.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    Sunday, October 18, 2009 11:45 PM
  • Olá Alan,

    Obrigado pela resposta, mas infelizmente o teu exemplo de código faz o mesmo do que postei acima.

    O que preciso de fato é abrir o arquivo existente para continuar escrevendo nele. De forma a acrescentar novas pessoas sem perder as anteriores.

    Ficarei no aguardo de quarder sugestão que puder me ajudar.

    Monday, October 19, 2009 10:54 AM
  • Olá Klayton,

    Obrigado pela resposta, tentei usar a rotina mas nao funcionou. Creio que o problema está no momento de abrir o arquivo para edição.
    Eu quero abrir o arquivo existente para continuar acrescentando novos dados sem perder os já inseridos.

    Ficarei no aguardo de quarder sugestão que puder me ajudar.
    Edival

    Monday, October 19, 2009 10:58 AM
  • No meu exemplo, cada vez que for clicado no botão salvar está sendo preservado o vetor original e serializando todos os valores do vetor.

    Fiz o teste na minha máquina.

    O que está acontecendo de errado?
    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
    Monday, October 19, 2009 11:03 AM
  • Alan, Modifiquei as duas rotinas para salvar e abrir de acordo com o teu exemplo, mas continua não preservando os valores anteriores. Continuo tentando aqui. Obrigado.
    Monday, October 19, 2009 11:23 AM
  • Quando eu clico no botao salvar ele preserva o valor original também. Porém, quando fecho a aplicacao e abro o arquivo e acrescento novos dados ele salva apenas os últimos inseridos. Ja tentei modificar de várias maneiras o código, mas nao estou conseguindo.

    Monday, October 19, 2009 12:37 PM
  • Oi,

    Da forma como está explicando, parece mais um problema da página no processo de edição do que da serialização.

    Se você tem uma coleção x que leu de um arquivo, adiciona um item na coleção x, serializa e grava novamente sobre o mesmo arquivo, os dados estarão lá.

    Me parece que sua aplicação pode estar fazendo algo errado nesta sequencia.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marked as answer by Edival Monday, October 19, 2009 4:15 PM
    Monday, October 19, 2009 12:46 PM
  • Isso significa que o botão salvar está funcionando perfeitamente, e preservando o vetor original, o problema está no load, pois quando você fecha a aplicação o vetor não está mais em memória e você perde os dados.
    Se esta resposta solucionou sua dúvida, “Marque como Resposta”
    Monday, October 19, 2009 12:49 PM
  • Este é o problema Dennes. A edição continuada do arquivo depois da sua abertura. ???
    Monday, October 19, 2009 2:34 PM
  • Oi,

    É uma questão de mudança de ponto de vista : Isso não existe no processo de serialização/deserialização - edição continuada do arquivo.

    Quando você deserializa no inicio da aplicação para ler os dados, você passa a ter um objeto .NET e irá editar este objeto .NET. Feche e esqueça o arquivo.

    Quando você terminar, irá serializar o objeto .NET novamente - depois de editado - e gravar por cima do arquivo antigo.

    []'s
    Dennes
    * Treinamento de ASP.NET 3.5 dia 24/10 - Apenas 12x R$ 70,88 - Inscreva-se em http://www.bufaloinfo.com.br/cursos/aspnet2.asp

    * Treinamento de Introdução a OO e Framework .NET c/C# dia  24/10 - Apenas 12 R$ 42,53  Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp

    Tel :  (11) 3170-3056  (21)9240-5134  E-Mail: contato arroba bufaloinfo.com.br
    http://www.bufaloinfo.com.br


    Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp
    • Marked as answer by Edival Monday, October 19, 2009 4:14 PM
    Monday, October 19, 2009 2:48 PM
  • Se é assim, então o problema realmente está em outro lugar e não nas rotinas de serialização/deserialização. obrigado.
    Monday, October 19, 2009 3:56 PM
  • Obrigado Dennes! Consegui resolver o problema!
    Monday, October 19, 2009 4:17 PM
  • PROBLEMA RESOLVIDO. OBRIGADO A TODOS PELA AJUDA!!
    Monday, October 19, 2009 4:19 PM
  • PROBLEMA RESOLVIDO. OBRIGADO A TODOS PELA AJUDA!!


    Desculpe a pergunta Edival, mas como ficou o código agora estando funcional?

    Abração
    Em busca de cursos e certificação de Visual Studio.
    Tuesday, October 20, 2009 10:47 AM
  • Olá Guilherme.

    A rotina AbrirArquivo foi implementada para manter o índice total de registros existentes depois da deserialização de forma que não fossem perdidos.

    O problema em si não estava na serialização/deserialização dos dados. Meu erro foi tentar trabalhar com a edição/sequencialização do arquivo
    ao invés do objeto .NET que me era retornado depois da deserialização, como bem explicou o Dennes.

    Abraço.

    Tuesday, October 20, 2009 1:29 PM