Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 18725|Répondre: 0

[Source] Une question sur la sérialisation et la désérialisation

[Copié le lien]
Publié sur 27/10/2015 19:07:26 | | | |
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 :

  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.         }
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 :
  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();
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 ?





Précédent:String[3] : la propriété Size a une taille invalide de 0.
Prochain:Serveur de connexion VS2010 Erreur temporelle VSS2005, le problème est tel que montré sur la figure, demandez l’aide du dieu
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com