Pergunta

O XML Schema Parte 2 especifica que uma instância de um tipo de dados que é definido como boolean pode ter os seguintes literais legais {verdadeiro, falso, 1, 0}. O XML a seguir, por exemplo, quando desserializado, define a propriedade boolean "Emulate" para true.

<root>
    <emulate>1</emulate>
</root>

No entanto, quando eu serializar o objeto de volta para o XML, recebo true em vez do valor numérico. A minha pergunta é, existe uma maneira que eu posso controlar a representação booleana no XML?

Foi útil?

Solução

Você pode implementar IXmlSerializable que permitirá que você altere a saída serializada de sua classe como quiser. Isto implicará criando o 3 métodos GetSchema (), ReadXml (XmlReader r) e WriteXml (XmlWriter r). Quando você implementar a interface, esses métodos são chamados em vez de NET tentando serializar o objeto em si.

Exemplos podem ser encontrados em:

http://www.developerfusion.co.uk/show/4639/ e

http://msdn.microsoft.com /en-us/library/system.xml.serialization.ixmlserializable.aspx

Outras dicas

Você também pode fazer isso usando alguma magia negra atributo XmlSerializer:

[XmlIgnore]
public bool MyValue { get; set; }

/// <summary>Get a value purely for serialization purposes</summary>
[XmlElement("MyValue")]
public string MyValueSerialize
{
    get { return this.MyValue ? "1" : "0"; }
    set { this.MyValue = XmlConvert.ToBoolean(value); }
}

Você também pode usar outros atributos para esconder esse membro da intellisense se você é ofendido por ela! Não é uma solução perfeita, mas pode ser mais rápido do que implementar IXmlSerializable.

Não, não usando o padrão System.Xml.XmlSerializer: você precisa mudar o tipo de dados para um int para conseguir isso, ou mexer com o fornecimento de seu próprio código de serialização (possível, mas não é muito divertido).

No entanto, você pode simplesmente pós-processar o XML gerado em vez disso, é claro, quer utilizando XSLT, ou simplesmente utilizando a substituição string. Um pouco de um truque, mas muito rápido, tanto em tempo de desenvolvimento e tempo de execução ...

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