Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 18725|Resposta: 0

[Fonte] Uma pergunta sobre serialização e desserialização

[Copiar link]
Publicado em 27/10/2015 19:07:26 | | | |
Ontem, quando eu estava fazendo testes de sincronização de banco de dados, usei um pouco de tecnologia de serialização e desserialização. Abstraio os campos de uma tabela em uma classe de entidade chamada DiagramInfo, depois armazeno os novos registros do cliente em uma coleção genérica, e então serializo essa coleção genérica e envio para o servidor via TCP, que a desserializa, e então escrevo esses dados no banco de dados. Provavelmente esse é o processo dessa operação.

       Serialização: Eu uso a classe System.Runtime.Serialization.Iformatter para serializar coleções genéricas em fluxos binários. Alguns dos códigos serializados são os seguintes:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
Copiar código
Depois, envie usando o protocolo TCP, essa parte é omitida.

O servidor recebe parcialmente os dados, salva como um MemoryStream e depois os desserializa; parte do código é a seguinte:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
Copiar código
Neste momento, execute o cliente e o servidor para sincronizar os dados, e a seguinte mensagem de erro aparece:
Comportamento de erro: diagramas = (Lista)formatador. Desserializar (memstream);
Literalmente: encontrei o fim do fluxo antes da conversão ser concluída.
2. SoluçãoApós uma busca no Google, alguém respondeu as seguintes possibilidades de erro:
1. Os tipos de serialização e desserialização são diferentes, o que pode ser excluído aqui;
2. Não há buffer para limpar o fluxo durante a serialização, e o método Flush() não é utilizado, o que também pode ser excluído aqui.
3. O tamanho do buffer do processo receptor antes da desserialização pode não ser suficiente, acho que não deveria haver problema com isso, a desserialização é realizada após o fluxo de aquisição, não deve ter nada a ver com o tamanho do buffer, opinião pessoal, não tentei;
4. Adicionar antes da desserializaçãoTrem. Posição=0。 (Stream é o stream a ser desserializado, na verdade memstream)
Depois dos testes, o quarto pode funcionar para o meu programa. Então, por que isso está acontecendo? Após uma única etapa de depuração, observe o memstream. O valor da posição muda, e descobre-se que toda vez que uma operação de escrita é realizada, o valor aponta para o fim, o que explica por que o programa reporta tal erro. Mas o que eu não entendo é por que a função de desserialização (Desserializar) em vez de desserializar todo o fluxo por padrão, começando de onde está a Posição?





Anterior:String[3]: a propriedade Size tem tamanho inválido de 0.
Próximo:vs2010 servidor de conexão vss2005 erro de tempo, o problema é como mostrado na figura, peça ajuda ao deus
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com