Hier, lors de mes tests de synchronisation de base de données, j’ai utilisé un peu de technologie de sérialisation et de désérialisation. J’abstrait les champs d’une table en une classe entité DiagramInfo, puis je stocke les nouveaux enregistrements du client dans une collection générique, puis je sérialise cette collection générique et je l’envoie au serveur via TCP, qui la désérialise, puis écrit ces données dans la base de données. C’est probablement le processus de cette opération.
Sérialisation J’utilise la classe System.Runtime.Serialization.Iformatter pour sérialiser des collections génériques en flux binaires. Une partie du code sérialisé est la suivante :
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
Code de copie Ensuite, envoie en utilisant le protocole TCP, cette partie est omise.
Le serveur reçoit partiellement les données, les sauvegarde sous forme de MemoryStream, puis les désérialise, une partie du code est la suivante :
- 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();
Code de copieÀ ce moment-là, lancez le client et le serveur pour synchroniser les données, et le message d’erreur suivant apparaît : Comportement d’erreur : diagrammes = formateur (liste). Désérialiser (memstream) ; Littéralement : j’ai rencontré la fin du ruisseau avant que la conversion ne soit terminée. 2. SolutionAprès une recherche Google, quelqu’un a répondu aux possibilités d’erreur suivantes :1. Les types de sérialisation et de désérialisation sont différents, ce qui peut être exclu ici ; 2. Il n’y a pas de tampon pour effacer le flux lors de la sérialisation, et la méthode Flush() n’est pas utilisée, ce qui peut également être exclu ici. 3. La taille du tampon du processus récepteur avant la désérialisation peut ne pas suffire, je pense qu’il ne devrait pas y avoir de problème avec cela, la désérialisation est effectuée après le flux d’acquisition, cela ne devrait avoir rien à voir avec la taille du tampon, mon avis personnel, je n’ai pas essayé ; 4. Ajouter avant la désérialisationTrem. Position = 0。 (Le flux est le flux à désérialiser, en réalité memstream) Après les tests, le quatrième pourrait fonctionner pour mon programme. Alors, pourquoi cela se produit-il ? Après une seule étape de débogage, observez le memstream ? La valeur de Position change, et on constate qu’à chaque opération d’écriture, la valeur pointe vers la fin, ce qui explique pourquoi le programme rapporte une telle erreur. Mais ce que je ne comprends pas, c’est pourquoi la fonction de désérialisation (Désérialiser) au lieu de désérialiser tout le flux par défaut, en partant de l’endroit où se trouve le Positionon ?
|