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:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
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:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
Copiar códigoNeste 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?
|