none
Serialização DataContract Condicional RRS feed

  • Pergunta

  • Boa noite amigos!

    Estou trabalhando com serialização de classes que me gera a seguinte estrutura de xml por exemplo:

    <classe1>
      <SubClasse1>
      <subClasse2>
      <subclasse3>
    </classe1>

    Até ai tudo bem, todas as classes tem  o atributo DataContract para poder serializa-la.

    Eu gostaria de saber como poderia fazer para que a classe seja serializada condicionalmente, ou seja, caso não satisfazer uma determinada condição, ela não ser serializada, por exemplo: Se a subclasse2 não atender a condição, ela não seria serializada. Ai o xml ficaria assim:

    <classe1>
      <SubClasse1>
      <subclasse3>
    </classe1>
    Poderiam me dar uma ajuda

    segunda-feira, 28 de abril de 2014 23:32

Respostas

  • Mas como você está fazendo o seu método que retorna essas classes neste modo !
    • Marcado como Resposta Bernoulthy terça-feira, 29 de abril de 2014 01:04
    terça-feira, 29 de abril de 2014 00:21
  • Ola Rodolfo,

    Consegui resolver adicionando um método boleano na propriedade da classe, ficou da seguinte maneira:

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public cSubClasse2 SubClasse2 { get; set; }
    public bool ShouldSerializeSubClasse2()
    { 
       if(// condição)
         return true;
       else
         return false;
    }

    Parece que é obrigatorio que o método seja publico e que tenha o prefixo "ShouldSerialize", parece se tratar de um partner que eu não conhecia. Vou dar uma pesquisada.

    Vlw


    • Editado Bernoulthy terça-feira, 29 de abril de 2014 01:05
    • Marcado como Resposta Bernoulthy terça-feira, 29 de abril de 2014 01:05
    terça-feira, 29 de abril de 2014 01:04

Todas as Respostas

  • Olá,

    Na propriedade, dentro do DataMember, adiciona o parametro "EmitDefaultValue = false", pois caso o objeto for null ele não vai serializar. Caso queira uma condição você terá que usar Reflection. E dependendo da quantidade de classe e propriedades o uso de Reflection pode tornar sua aplicação bem lenta.

    Espero ter ajudado, qualquer coisa só chamar ;)

    Att,

    Rodolfo Oliveira


    terça-feira, 29 de abril de 2014 00:20
  • Mas como você está fazendo o seu método que retorna essas classes neste modo !
    • Marcado como Resposta Bernoulthy terça-feira, 29 de abril de 2014 01:04
    terça-feira, 29 de abril de 2014 00:21
  • Ola Rodolfo,

    Consegui resolver adicionando um método boleano na propriedade da classe, ficou da seguinte maneira:

    [DataMember(IsRequired = false, EmitDefaultValue = false)]
    public cSubClasse2 SubClasse2 { get; set; }
    public bool ShouldSerializeSubClasse2()
    { 
       if(// condição)
         return true;
       else
         return false;
    }

    Parece que é obrigatorio que o método seja publico e que tenha o prefixo "ShouldSerialize", parece se tratar de um partner que eu não conhecia. Vou dar uma pesquisada.

    Vlw


    • Editado Bernoulthy terça-feira, 29 de abril de 2014 01:05
    • Marcado como Resposta Bernoulthy terça-feira, 29 de abril de 2014 01:05
    terça-feira, 29 de abril de 2014 01:04