REVISIÓN: Objetos no se serializan correctamente al serializar y deserializar los objetos DataSet mediante el parámetro de formato de SerializationFormat.Binary en una aplicación basada en .NET Framework 2.0

Seleccione idioma Seleccione idioma
Id. de artículo: 948646 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Si una aplicación basada en .NET Framework 2.0 en Microsoft intenta para serializar y deserializar objetos DataSet mediante el parámetro de formato SerializationFormat.Binary , los objetos no se serializan correctamente.

Causa

Este problema se produce debido a un error en el archivo System.Design.dll.

Solución

Información de revisiones

Hay una revisión compatible de Microsoft. Sin embargo, se diseñó para corregir el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico.

Para resolver este problema, póngase en contacto con servicios de soporte de cliente de Microsoft para obtener la revisión. Para obtener una lista completa de los números de teléfono de los servicios de soporte técnico de Microsoft e información acerca de los costos de soporte, visite el siguiente sitio Web:
http://support.microsoft.com/contactus/?ws=support
Nota en casos especiales, los costos derivados normalmente de las llamadas al soporte técnico pueden cancelarse si un profesional de soporte técnico de Microsoft determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión.

Requisitos previos

Debe tener .NET Framework 2.0 instalado para aplicar esta revisión.

Requisito de reinicio

No es necesario reiniciar el equipo después de aplicar este hotfix.

Información acerca de la sustitución de la revisión

Este hotfix no sustituye a otros hotfix.

Información de archivo

La versión en inglés de este hotfix tiene los atributos de archivo (o atributos de último archivo) mostrados en la siguiente tabla. Las fechas y las horas de estos archivos se muestran en hora universal coordinada (UTC). La información de los archivos se convertirá a la hora local cuando la vea. Para averiguar la diferencia entre hora UTC y la hora local, utilice la ficha zona horaria el elemento fecha y hora en el panel de control.
Contraer esta tablaAmpliar esta tabla
Nombre de archivoArchivo VersiónTamaño del archivoFechaTiempoPlataforma
System.Design.dll2.0.50727.18155,046,27227 De febrero de 200811: 47x 86

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:".

Pasos para reproducir el problema

  1. Crear una nueva aplicación de consola que se denomina "ConsoleAppTestDTset."
  2. Crear un nuevo elemento de DataSet que se denomina "DsTest.xsd."
  3. Agregar una tabla de tipo de DataTable que se denomina "dtTest."
  4. Agregar dos columnas que se denominan col1 y col2 a la tabla. Asegúrese de que el tipo de datos de cada columna está establecido a System.Int32 .
  5. Establezca la siguiente expresión en "col 2":
    col1 * 2
  6. En el método main, inserte el siguiente código:
    static void Main(string[] args)
            {
                // Create a dataset instance.
                DataSet ds = new DsTest();
                // Add a row.
                ds.Tables["dtTest"].Rows.Add(1);
                ds.Tables["dtTest"].Rows.Add(2);
                ds.Tables["dtTest"].Rows.Add(3);
                // Show rows to see that the expression works
                foreach (DataRow dr in ds.Tables["dtTest"].Rows)
                {
                    Console.WriteLine("col1: {0}, col2: {1}", dr[0], dr[1]);
                }
                Console.WriteLine("Expression = " + ds.Tables["dtTest"].Columns["col2"].Expression);
                Console.WriteLine();
                // Do the serialization or the deserialization.
                byte[] serializedDS;
                ds.SchemaSerializationMode = SchemaSerializationMode.ExcludeSchema;
                // Using SerializationFormat.Binary fails.
                ds.RemotingFormat = SerializationFormat.Binary;
                // Using SerializationFormat.Xml works.
                //ds.RemotingFormat = SerializationFormat.Xml;
                
                // Serialize.
                MemoryStream ms = new MemoryStream();
                BinaryFormatter bf = new BinaryFormatter();
                bf.Serialize(ms, ds);
                serializedDS = ms.ToArray();
    
                // Deserialize.
                ms.Write(serializedDS, 0, serializedDS.Length);
                                         ms.Position = 0;
                DataSet newDs = (DataSet)bf.Deserialize(ms);
                // Display the deserialized dataset.
                foreach (DataRow dr in newDs.Tables["dtTest"].Rows)
                {
                    Console.WriteLine("col1: {0}, col2: {1}", dr[0], dr[1]);
                }
                Console.WriteLine("Expression = " + newDs.Tables["dtTest"].Columns["col2"].Expression);
                Console.WriteLine();
    
                Console.WriteLine("Done..!");
                Console.Read();
            }
    When you run the application, the expression string is not displayed in the Output Window as expected.
  7. En el archivo DsTest.Designer.cs, busque el siguiente código:
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]protected DsTest(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context, false) 
    {
       if ((this.IsBinarySerialized(info, context) == true)) 
       {
          this.InitVars(false);   
          System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);   
          this.Tables.CollectionChanged += schemaChangedHandler1;   
          this.Relations.CollectionChanged += schemaChangedHandler1;   
          return;
       }
    ...
    
  8. Reemplace este código mediante el siguiente código:
    [System.Diagnostics.DebuggerNonUserCodeAttribute()]protected DsTest(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context) : base(info, context, false) 
    {
       if ((this.IsBinarySerialized(info, context) == true)) 
       {
          this.InitVars(false);   
          System.ComponentModel.CollectionChangeEventHandler schemaChangedHandler1 = new System.ComponentModel.CollectionChangeEventHandler(this.SchemaChanged);   
          this.Tables.CollectionChanged += schemaChangedHandler1;   
          this.Relations.CollectionChanged += schemaChangedHandler1;
     
          // These two lines are the only new ones.
          if ((this.DetermineSchemaSerializationMode(info, context) == System.Data.SchemaSerializationMode.ExcludeSchema))      
             this.InitExpressions();
     
          return;
       }
    ...
    
    cuando guarde y vuelva a ejecutar la aplicación, la cadena de expresión se muestra en la ventana Resultados.
Nota Si modifica el objeto DataSet y, a continuación, volver a generar la aplicación, desaparece el código que agregó en el paso 8.

Para obtener más información acerca de la serialización binaria de los objetos DataSet , visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/magazine/cc163911.aspx
Para obtener más información acerca de la terminología relativa de la actualización de software, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684Descripción de la terminología estándar utilizada para describir las actualizaciones de software de Microsoft

Propiedades

Id. de artículo: 948646 - Última revisión: martes, 15 de abril de 2008 - Versión: 1.0
La información de este artículo se refiere a:
  • Microsoft .NET Framework 2.0
Palabras clave: 
kbmt kbpubtypekc kbqfe kbhotfixserver kbexpertiseadvanced KB948646 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 948646

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com