CORRECÇÃO: Os objetos não são serializados corretamente quando serializar e desserializar objetos DataSet usando o parâmetro de formato SerializationFormat.Binary em um aplicativo baseado no .NET Framework 2.0

Traduções deste artigo Traduções deste artigo
ID do artigo: 948646 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Se um aplicativo de baseado no .NET Framework 2.0 do Microsoft tenta para serializar e desserializar objetos DataSet usando o parâmetro de formato SerializationFormat.Binary , os objetos não são serializados corretamente.

Causa

Esse problema ocorre devido a um erro no arquivo System.Design.dll.

Resolução

Informações sobre o hotfix

Um hotfix com suporte foi disponibilizada pela Microsoft. No entanto, destina-se a corrigir o problema descrito neste artigo. Aplique-o somente aos sistemas que apresentarem esse problema específico.

Para resolver esse problema, contate o Microsoft Customer Atendimento para obter o hotfix. Para obter uma lista completa de telefones do serviço de suporte a clientes da Microsoft e informações sobre os custos de suporte, visite o seguinte site:
http://support.microsoft.com/contactus/?ws=support
Observação Em alguns casos, as taxas cobradas pelas ligações para chamadas de suporte podem ser canceladas se um profissional de suporte da Microsoft determinar que uma atualização específica resolverá o problema. Os custos normais de suporte serão aplicados a questões e problemas que não se qualificam à atualização específica em questão de suporte adicionais.

Pré-requisitos

Você deve ter o .NET Framework 2.0 instalado para aplicar esse hotfix.

Requisitos de reinicialização

Não é necessário reiniciar o computador após aplicar esse hotfix.

Informações sobre a substituição do hotfix

Esse hotfix não substitui outros hotfixes.

Informações sobre o arquivo

A versão em inglês deste hotfix tem atributos de arquivo (ou atributos de arquivo posteriores) listados na tabela a seguir. As datas e horas desses arquivos estão listadas no horário de universal coordenado (UTC). Quando você exibe as informações do arquivo, ele é convertido para a hora local. Para encontrar a diferença entre o UTC e a hora local, use a guia fuso horário no item Data e hora no painel de controle.
Recolher esta tabelaExpandir esta tabela
Nome de arquivoVersão do arquivoTamanho do arquivoDataTempoPlataforma
System.design.dll2.0.50727.18155,046,27227 De fevereiro de 200811: 47x 86

Situação

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na seção "Aplica-se a".

Etapas para reproduzir o problema

  1. Criar um novo aplicativo de console chamado "ConsoleAppTestDTset."
  2. Criar um novo item DataSet que é chamado de "DsTest.xsd."
  3. Adicionar uma tabela de tipo de DataTable é chamada de "dtTest."
  4. Adicione duas colunas que são nomeadas col1 e col2 à tabela. Verifique se o tipo de dados de cada coluna é definido para System.Int32 .
  5. Defina a expressão a seguir para "col 2":
    col1 * 2
  6. No método principal, insira o seguinte 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. No arquivo DsTest.Designer.cs, localize o código a seguir:
    [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. Substituir esse código usando o código a seguir:
    [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;
       }
    ...
    
    quando você salva e execute novamente o aplicativo, a seqüência de expressão é exibida na janela de saída.
Observação Se você modificar o objeto DataSet e, em seguida, recriar o aplicativo, o código que você adicionou na etapa 8 desaparece.

Para obter mais informações sobre objetos DataSet de serialização binária, visite o seguinte site da Web Microsoft Developer Network (MSDN):
http://msdn2.microsoft.com/en-us/magazine/cc163911.aspx
Para obter mais informações sobre terminologia de atualização de software, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
824684Descrição da terminologia padrão que é usada para descrever as atualizações de software

Propriedades

ID do artigo: 948646 - Última revisão: terça-feira, 15 de abril de 2008 - Revisão: 1.0
A informação contida neste artigo aplica-se a:
  • Microsoft .NET Framework 2.0
Palavras-chave: 
kbmt kbpubtypekc kbqfe kbhotfixserver kbexpertiseadvanced KB948646 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 948646

Submeter comentários

 

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