Подтвердить что ты не робот

XML Serialize boolean как 0 и 1

Часть 2 схемы XML указывает, что экземпляр типа данных, который определяется как boolean, может иметь следующие юридические литералы {true, false, 1, 0}. Следующий XML, например, при десериализации, устанавливает логическое свойство "Emulate" на true.

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

Однако, когда я сериализую объект обратно в XML, я получаю true вместо численного значения. Мой вопрос в том, есть ли способ, которым я могу управлять логическим представлением в XML?

4b9b3361

Ответ 1

Вы можете реализовать IXmlSerializable, который позволит вам изменить серийный вывод вашего класса, как вы хотите. Это повлечет за собой создание 3 методов GetSchema(), ReadXml (XmlReader r) и WriteXml (XmlWriter r). Когда вы реализуете интерфейс, эти методы вызывают вместо .NET, пытаясь сериализовать сам объект.

Примеры можно найти по адресу:

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

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

Ответ 2

Вы также можете сделать это, используя атрибут 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); }
}

Вы также можете использовать другие атрибуты, чтобы скрыть этого участника от intellisense, если вы его обидели! Это не идеальное решение, но оно может быть быстрее, чем реализация IXmlSerializable.

Ответ 3

Нет, не используя стандартный System.Xml.XmlSerializer: вам нужно будет изменить тип данных на int, чтобы достичь этого, или гадать с предоставлением собственного кода сериализации (возможно, но не очень весело).

Однако вы можете просто обработать сгенерированный XML вместо этого, конечно, либо с помощью XSLT, либо просто с помощью замены строк. Немного взлома, но довольно быстро, как во время разработки, так и во время выполнения...