XML Сериализует логические значения как 0 и 1
-
01-07-2019 - |
Вопрос
В части 2 схемы XML указывается, что экземпляр типа данных, который определен как boolean, может иметь следующие допустимые литералы {true, false, 1, 0}.Следующий XML-файл, например, при десериализации устанавливает логическое свойство "Emulate" равным true
.
<root>
<emulate>1</emulate>
</root>
Однако, когда я сериализую объект обратно в XML, я получаю true
вместо числового значения.Мой вопрос в том, есть ли способ, которым я могу управлять логическим представлением в XML?
Решение
Вы можете реализовать 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
Другие советы
Вы также можете сделать это, используя некоторый атрибут 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.
Нет, не используется System.Xml.XmlSerializer по умолчанию:для достижения этого вам нужно было бы изменить тип данных на int или повозиться с предоставлением собственного кода сериализации (возможно, но не очень весело).
Однако вместо этого, конечно, вы можете просто выполнить постобработку сгенерированного XML либо с помощью XSLT, либо просто с помощью подстановки строк.Небольшой взлом, но довольно быстрый, как по времени разработки, так и по времени выполнения...