Eu tenho uma classe com um int anulável? tipo de dados definido para serializar como um elemento xml. Existe alguma maneira de configurá-lo para que o serializador xml não serialize o elemento se o valor for nulo?
Tentei adicionar o atributo [System.Xml.Serialization.XmlElement (IsNullable = false)], mas recebo uma exceção de serialização de tempo de execução informando que houve um erro refletindo o tipo, porque "IsNullable não pode ser definido como 'false 'para um tipo Nullable. Considere usar o tipo' System.Int32 'ou remover a propriedade IsNullable do atributo XmlElement. "
[Serializable]
[System.Xml.Serialization.XmlRoot("Score", Namespace = "http://mycomp.com/test/score/v1")]
public class Score
{
private int? iID_m;
...
/// <summary>
///
/// </summary>
public int? ID
{
get
{
return iID_m;
}
set
{
iID_m = value;
}
}
...
}
A classe acima será serializada para:
<Score xmlns="http://mycomp.com/test/score/v1">
<ID xsi:nil="true" />
</Score>
Mas para IDs que são nulos, eu não quero o elemento ID, principalmente porque quando eu uso OPENXML no MSSQL, ele retorna 0 em vez de nulo para um elemento que se parece com
fonte
HasValue
para a propriedade.Foo
você também tiver umpublic bool FooSpecified {get {...} set {...}}
, oget
será usado para ver seFoo
deve ser serializado e oset
será chamado ao atribuir um valor aFoo
durante a desserialização.Estou usando este micropadrão para implementar a serialização anulável:
Isso fornece a interface certa para o usuário sem concessões e ainda faz a coisa certa ao serializar.
fonte
Eu descobri uma solução alternativa utilizando duas propriedades. Um int? propriedade com um atributo XmlIgnore e uma propriedade de objeto que é serializada.
fonte
Nossa, obrigado, essa pergunta / resposta realmente me ajudou. Eu amo Stackoverflow.
Tornei o que você está fazendo acima um pouco mais genérico. Tudo o que realmente estamos procurando é ter Nullable com comportamento de serialização ligeiramente diferente. Usei o Reflector para construir meu próprio Nullable e adicionei algumas coisas aqui e ali para fazer a serialização XML funcionar da maneira que desejamos. Parece funcionar muito bem:
Você perde a capacidade de ter seus membros como int? e assim por diante (tem que usar Nullable <int> ao invés), mas exceto que todo o comportamento permanece o mesmo.
fonte
System.ExecutionEngineException
emXmlSerializer.Serialize
mim.Infelizmente, os comportamentos que você descreve são documentados com precisão como tal nos documentos de XmlElementAttribute.IsNullable.
fonte
Postagem muito útil ajudou muito.
Optei por ir com a revisão de Scott para o tipo de dados Nullable (Of T), no entanto, o código postado ainda serializa o elemento Nullable quando ele é Null - embora sem o atributo "xs: nil = 'true'".
Eu precisava forçar o serializador a descartar a tag completamente, então simplesmente implementei IXmlSerializable na estrutura (isso está em VB, mas você entendeu):
Prefiro esse método a usar o padrão (foo) Especificado, pois isso requer a adição de cargas de balde de propriedades redundantes aos meus objetos, enquanto o uso do novo tipo Nullable requer apenas a redigitação das propriedades.
fonte