Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 18725|Respuesta: 0

[Fuente] Una pregunta sobre serialización y deserialización

[Copiar enlace]
Publicado en 27/10/2015 19:07:26 | | | |
Ayer, cuando hacía pruebas de sincronización de bases de datos, utilicé un poco de tecnología de serialización y deserialización. Abstrayo los campos de una tabla en una clase de entidad llamada DiagramInfo, luego almaceno los nuevos registros del cliente en una colección genérica, y después serializo esta colección genérica y la envío al servidor a través de TCP, que la deserializa, y después escribo estos datos en la base de datos. Probablemente este sea el proceso de esta operación.

       Serialización Utilizo la clase System.Runtime.Serialization.Iformatter para serializar colecciones genéricas en flujos binarios. Parte del código serializado es el siguiente:

  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
Luego envía usando el protocolo TCP, esta parte se omite.

El servidor recibe parcialmente los datos, los guarda como un MemoryStream y luego los deserializa; parte del código es la siguiente:
  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
En ese momento, ejecuta el cliente y el servidor para sincronizar los datos, y aparece el siguiente mensaje de error:
Comportamiento de error: diagramas = (Lista)formatador. Desserializar (memstream);
Literalmente: me encontré con el final del arroyo antes de que la conversión estuviera completa.
2. SoluciónTras una búsqueda en Google, alguien respondió a las siguientes posibilidades de error:
1. Los tipos de serialización y deserialización son diferentes, lo que puede excluirse aquí;
2. No hay búfer para limpiar el flujo durante la serialización, y no se utiliza el método Flush(), que también puede excluirse aquí.
3. El tamaño del buffer del proceso receptor antes de la deserialización puede no ser suficiente, creo que no debería haber problema con esto, la deserialización se realiza después del flujo de adquisición, no debería tener nada que ver con el tamaño del buffer, opinión personal, no lo he probado;
4. Añadir antes de la deserializaciónTreme. Posición=0。 (Stream es el stream que se va a desserializar, en realidad memstream)
Después de los exámenes, el cuarto puede funcionar para mi programa. Entonces, ¿por qué ocurre esto? Tras un solo paso de depuración, observa el flujo mem. El valor de Position cambia, y se descubre que cada vez que se realiza una operación de escritura, el valor apunta al final, lo que explica por qué el programa reporta tal error. Pero lo que no entiendo es por qué la función de deserialización (¿Deserializar) en lugar de deserializar todo el flujo por defecto, empezando desde donde está la posición?





Anterior:Cadena[3]: la propiedad Size tiene un tamaño inválido de 0.
Próximo:Servidor de conexión VS2010 Error de tiempo VSS2005, el problema es como se muestra en la figura, pide ayuda al dios
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com