Pergunta

Estou certo em entender o .net Xmlignoreattribute, que diz:

Instrui o método serialize do XMLSerializer a não serializar serializar o campo público ou o valor da propriedade de leitura/gravação pública.

este:

  • A propriedade será desserializada, se presente no arquivo XML?
  • A propriedade não será serializada para um novo arquivo XML?

A razão pela qual estou perguntando é que substituí uma propriedade no arquivo por um novo com mais opções. A propriedade antiga era uma propriedade booleana simples, e a nova é uma enumeração. Alterei a propriedade antiga para que ela converte o valor da nova propriedade em um valor booleano, de acordo com o que a propriedade antiga significava antes de adicionar a nova, ambos Get e Set foi implementado.

Isso me permitiu atualizar silenciosamente novos arquivos lendo a propriedade antiga, que definiu a nova propriedade e, após a serialização, a nova propriedade foi adicionada.

No entanto, eu gostaria de remover a propriedade antiga de novos arquivos XML, então eu estava me perguntando o que aconteceria se eu a marcasse com [XmlIgnore], o arquivo XML antigo ainda merecia corretamente e leria essa propriedade do arquivo, ou seria completamente ignorado?

Caso contrário, a mudança seguinte faria o que eu quero?

[XmlAttribute("is-list")]
[DefaultValue(false)]
public bool IsList
{
    get { return false; }
    set {
        if (value)
            ListHandling = ListHandling.All;
    }
}

Isso retornaria false para todos os novos objetos, que seriam ignorados, pois eu especifiquei um valor padrão e, se presente em um arquivo antigo, e definido como true, isso mudaria a propriedade de Listhandling, que é a nova que é importante.

Editar: Ao testar, verifiquei que ambas as abordagens parecem fazer o que eu quero. Vou deixar a pergunta, pois ainda gostaria de saber se o primeiro comportamento mencionado acima é apenas um detalhe da implementação ou se a documentação pode ser entendida dessa maneira.

Foi útil?

Solução

Se você marcar uma propriedade com XmlIgnore, isso é ignorado. Não é considerado quando o XMLSerializer constrói sua montagem de serialização. Portanto, as propriedades do XMLignore-D não são preenchidas durante a desserialização e ficarão com seu valor padrão.

Programa de amostra (para compilador de snippet):

public static void RunSnippet()
{
  XmlSerializer ser = new XmlSerializer(typeof(Fie));
  Fie f = (Fie)(ser.Deserialize(new StringReader("<Fie><Bob>Hello</Bob></Fie>")));
  WL(f.Bob == null ? "null" : "something");
}

public class Fie
{
  [XmlIgnore]
  public string Bob { get; set; }
}

A saída deste programa é null (e se você remover o xmlignore do fie.BOB, a saída é something).

Editar em resposta à sua edição: Este não é apenas um detalhe de implementação; É de fato o comportamento documentado do atributo. Da seção de observações de os documentos (Primeiro parágrafo): "Se você aplicar o XMLignorEattribute a qualquer membro de uma classe, o XMLSerializer ignora o membro ao serializar ou desaperando uma instância da classe. "(ênfase adicionada)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top