PROBLEMA: Serialização de XML: System.XML.XmlSerializer não serializar os valores padrão

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: 325691
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
System.XML.XmlSerializer não serializar os valores padrão que estão presentes nos esquemas XML (XSD). Por exemplo, se o esquema contém a seguinte linha, o valor padrão de False para o <boolf> elemento não é serializado:
<xsd:element name="boolF" type="xsd:boolean" minOccurs="1" maxOccurs="1" default="false" />				
Causa
Este é um trecho da documentação do Microsoft .NET Framework SDK:
Se o valor atribuído a um campo ou propriedade for igual ao valor padrão para esse campo ou propriedade, o XmlSerializer não irá serializar o valor para a instância XML.
Para obter mais informações sobre esse comportamento, consulte a seguinte site da Microsoft Developer Network (MSDN):
Resolução
Uma das duas seguintes soluções alternativas pode ser usada para resolver esse problema:
  1. Depois que o arquivo XSD.exe gera as classes de esquemas, comente ou remover manualmente todos os atributos [System.ComponentModel.DefaultValueAttribute("myFieldName")] dos arquivos de classe.
  2. Use os construtores de classe em vez do esquema para atribuir os valores padrão.
Situação
Esse comportamento é por design.

A Microsoft planeja alterar esse comportamento na próxima versão principal de versão do .NET Framework.
Mais Informações
Esse comportamento apresenta limitações, como o seguinte:
  • A estrutura (o esquema ou a classe) sempre deve ser passada com os dados.
  • Para recuperar o valor padrão do esquema, ele deve ser analisado cada vez.

Passos para reproduzir o problema

  1. Use um editor de texto, como o bloco de notas para salvar o seguinte como Q325691.xsd:
    <?xml version="1.0" ?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  targetNamespace="urn:myNS" xmlns:myXMLNS="urn:myNS" elementFormDefault="qualified"><xsd:element name="testDefault" type="myXMLNS:TestDefault"/><xsd:complexType name="TestDefault">	<xsd:sequence>		<xsd:element name="str" type="xsd:string" maxOccurs="1" />		<xsd:element name="strDefault" type="xsd:string" minOccurs="1" maxOccurs="1" default="Default Value" />		<xsd:element name="boolT" type="xsd:boolean" minOccurs="1" maxOccurs="1" default="true" />		<xsd:element name="boolF" type="xsd:boolean" minOccurs="1" maxOccurs="1" default="false" />		<xsd:element name="decimalval" type="xsd:decimal" minOccurs="1" maxOccurs="1" default="10" />	</xsd:sequence></xsd:complexType></xsd:schema>
  2. Use o utilitário XSD.exe para criar uma classe do Microsoft .NET para este esquema. Para fazer isso, clique em Iniciar , em programas , clique em Microsoft Visual Studio. NET , clique em Visual Studio .NET Tools e clique em Visual Studio .NET Command Prompt para abrir a janela de comando do Visual Studio .NET e, em seguida, executar um comando semelhante à seguinte:
    xsd.exe /c /n:TestDefaultNS C:\myDir\Q325691.xsd /out:C:\myDir
    A opção /c indica a criação de classes, a opção /out indica o diretório de saída e a opção /n Especifica o namespace para usar ao gerar a classe. A saída será similar à seguinte:
    Microsoft (R) Xml Schemas/DataTypes support utility[Microsoft (R) .NET Framework, Version 1.0.3705.0]Copyright (C) Microsoft Corporation 1998-2001. All rights reserved.Writing file 'C:\myDir\Q325691.cs'.					
    isso cria uma classe Visual translation from VPE for Csharp chamada Q325691.cs. Seu conteúdo se parece com o seguinte:
    //------------------------------------------------------------------------------// <autogenerated>//     This code was generated by a tool.//     Runtime Version: 1.0.3705.0// //     Changes to this file may cause incorrect behavior and will be lost if //     the code is regenerated.// </autogenerated>//------------------------------------------------------------------------------// // This source code was auto-generated by xsd, Version=1.0.3705.0.// namespace TestDefaultNS {    using System.Xml.Serialization;            /// <remarks/>    [System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:myNS")]    [System.Xml.Serialization.XmlRootAttribute("testDefault", Namespace="urn:myNS", IsNullable=false)]    public class TestDefault {                /// <remarks/>        public string str;                /// <remarks/>        [System.ComponentModel.DefaultValueAttribute("Default Value")]        public string strDefault = "Default Value";                /// <remarks/>        [System.ComponentModel.DefaultValueAttribute(true)]        public bool boolT = true;                /// <remarks/>        [System.ComponentModel.DefaultValueAttribute(false)]        public bool boolF = false;                /// <remarks/>        [System.ComponentModel.DefaultValueAttribute(typeof(System.Decimal), "10")]        public System.Decimal decimalval = ((System.Decimal)(10m));    }}
  3. Criar um novo aplicativo de console Microsoft Visual translation from VPE for Csharp .NET chamado Q325691 e cole o seguinte no arquivo Class1.cs:
    using System;using System.IO;using System.Text;using System.Xml.Serialization;using TestDefaultNS;namespace Q325691{   class Class1   {      [STAThread]      static void Main(string[] args)      {         try         {            // Create a new class instance for serialization.            TestDefault td = new TestDefault();            XmlSerializer serializer = new XmlSerializer(typeof(TestDefault), "urn:myNS");                              // Serialize the object and display the output.            StringBuilder sb = new StringBuilder();            StringWriter sw = new StringWriter(sb);            serializer.Serialize(sw, td);            Console.Write(sw.ToString() + "\n\n");         }         catch (Exception ex)         {            Console.Write(ex.Message + "\r\n" + ex.InnerException.Message);         }      }   }}
  4. No menu Project, clique em Add Existing Item para adicionar o arquivo de classe Q325691.cs ao projeto.
  5. Compilar e executar o aplicativo. A saída será similar à seguinte. Observe que os elementos não são serializados:
    <?xml version="1.0" encoding="utf-16"?><testDefault xmlns:xsd="http://www.w3.org/2001/XMLSchema"                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                   xmlns="urn:myNS" />					
  6. Modificar Q325691.cs para tentar a primeira solução, da seguinte maneira. Observe que as linhas que especificar DefaultValueAttribute são comentadas:
    //------------------------------------------------------------------------------// <autogenerated>//     This code was generated by a tool.//     Runtime Version: 1.0.3705.0// //     Changes to this file may cause incorrect behavior and will be lost if //     the code is regenerated.// </autogenerated>//------------------------------------------------------------------------------// // This source code was auto-generated by xsd, Version=1.0.3705.0.// namespace TestDefaultNS {    using System.Xml.Serialization;            /// <remarks/>    [System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:myNS")]    [System.Xml.Serialization.XmlRootAttribute("testDefault", Namespace="urn:myNS", IsNullable=false)]    public class TestDefault {                /// <remarks/>        public string str;                /// <remarks/>        //[System.ComponentModel.DefaultValueAttribute("Default Value")]        public string strDefault = "Default Value";                /// <remarks/>        //[System.ComponentModel.DefaultValueAttribute(true)]        public bool boolT = true;                /// <remarks/>        //[System.ComponentModel.DefaultValueAttribute(false)]        public bool boolF = false;                /// <remarks/>        //[System.ComponentModel.DefaultValueAttribute(typeof(System.Decimal), "10")]        public System.Decimal decimalval = ((System.Decimal)(10m));    }}					
  7. Compilar e executar o aplicativo. A saída será similar à seguinte. Observe que os elementos são serializados:
    <?xml version="1.0" encoding="utf-16"?><testDefault xmlns:xsd="http://www.w3.org/2001/XMLSchema"                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                   xmlns="urn:myNS">  <strDefault>Default Value</strDefault>  <boolT>true</boolT>  <boolF>false</boolF>  <decimalval>10</decimalval></testDefault>					
Referências
Para obter informações adicionais, clique no número abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
314150INFO: Guia para a serialização XML no .NET Framework
Para obter mais informações, visite o seguinte site da Web Microsoft Developer Network (MSDN):
Ferramenta de definição de esquema XML (XSD.exe)
http://msdn2.microsoft.com/en-us/library/x6c1kb0s(vs.71).aspx

Aviso: este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 325691 - Última Revisão: 12/07/2015 11:42:56 - Revisão: 2.3

Microsoft .NET Framework 1.0

  • kbnosurvey kbarchive kbmt kbprb KB325691 KbMtpt
Comentários