none
Serialização XML RRS feed

  • Pergunta

  • Senhores,

     

    Estou com o seguinte problema,

    Criei um XSD para servir de base para um arquivo XML que será o mapeamento de um banco de dados, usei a ferramente “xsd.exe” para gerar a classe .cs referente ao XSD, leio as informações do banco e preencho em uma instancia dessa classe.

    A classe contém vários campos e propriedades de vários tipos segue resumo abaixo:

    /// <remarks/>

    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.42")]

    [System.SerializableAttribute()]

    [System.Diagnostics.DebuggerStepThroughAttribute()]

    [System.ComponentModel.DesignerCategoryAttribute("code")]

    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]

    public partial class Mapeamento

    {


    private string propriedadeField;

    private string tipoField;

    private string nomeField;

    private int tamanhoField;


    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public string propriedade

    {

    get {this.nomeField;}

    set {this.nomeField = value;}

    }


    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public string tipo

    {

    get {this.tipoField;}

    set {this. tipoField = value;}

    }


    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public string nome

    {

    get {this.nomeField;}

    set {this. nomeField = value;}

    }

    /// <remarks/>

    [System.Xml.Serialization.XmlAttributeAttribute()]

    public int tamanho

    {

    get {return this.tamanhoField;}

    set { this.tamanhoField = value;}

    }


    }


    Após preencher todos as propriedades utilizo o Metodo abaixo para gerar o XML


    public static void EscreverEsquemaMapeamento(Mapeamento mapeamento)

    {

    XmlSerializer xml = new XmlSerializer(typeof(Mapeamento));

    TextWriter writer = new StreamWriter(@"C:\Mapeamento.xml", mapeamento);


    xml.Serialize(writer, mapeamento);

    writer.Close();

    }


    O arquivo XML é gerado de acordo com o XSD, agora os atributos que não são do tipo string não são gerado no XML apesar de estarem presentes na classe e serem preenchidos com valores.


    Atributos do XML gerado:


    <Mapeamento propriedade="Identificador" tipo="Int32" nome="IDClasse" />


    Como podem ver apenas o atributo do tipo int não foi gerado. Encontrei em vários fóruns alguns exemplos de pessoas que estão passando ou passaram pelo mesmo problema, contudo, nenhuma das soluções empregadas resolveu o meu problema.


    Na maioria dos casos a solução é simples apenas pedem para acrescentar o atributo, as opções que encontrei foram:


    [XmlAttributeAttribute( DataType = "int")]

    [XmlAttribute( DataType = "int")]

    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]



    Alguém já passou por isso ?

    quarta-feira, 28 de novembro de 2007 12:49

Respostas

  • Senhores, consegui resolver o problema, segue abaixo a solução.

     

    A classe .cs que a ferramenta "xsd.exe" gera, para cada campo do xsd são geradas duas propriedade e dois campos, um tipo do campo especificado e a outra do tipo "bool" seguido pela palavra Specified como segue:

    private bool tamanhoFieldSpecified;

     

    public bool tamanhoSpecified

    {

    get{return this.tamanhoFieldSpecified;}

    set{this.tamanhoFieldSpecified = value;}

    }

     

    Então tudo que temos a fazer é acrescentar à propriedade o atributo [XmlIgnore], e no ato de atribuir valor a propriedade setar esse campo para true. 

     

     [XmlIgnore]

    public bool tamanhoSpecified

    {

    get{return this.tamanhoFieldSpecified;}

    set{this.tamanhoFieldSpecified = value;}

    }

     

    campo.tamanho = row.length;

    campo.tamanhoSpecified = true;

     

    Agora o XML é gerado corretamente.

     

     

    quarta-feira, 28 de novembro de 2007 19:11