Часть 2 схемы XML указывает, что экземпляр типа данных, который определен как логический, может иметь следующие допустимые литералы {true, false, 1, 0}.
Следующий XML, например, при десериализации устанавливает для логического свойства «Эмулировать» значение true.
<root>
<emulate>1</emulate>
</root>
Однако, когда я сериализую объект обратно в XML, я получаю true вместо числового значения. Мой вопрос: есть ли способ контролировать логическое представление в XML?
Дополнительный вопрос по той же теме на CoreReview.SE





Нет, не использовать System.Xml.XmlSerializer по умолчанию: вам нужно будет изменить тип данных на int, чтобы добиться этого, или возиться с предоставлением собственного кода сериализации (возможно, но не очень весело).
Однако вы можете просто постобработать сгенерированный XML вместо этого, конечно, либо с помощью XSLT, либо просто с помощью подстановки строк. Немного хака, но довольно быстро, как во время разработки, так и во время выполнения ...
Вы можете реализовать IXmlSerializable, который позволит вам изменять сериализованный вывод вашего класса, как вы хотите. Это повлечет за собой создание трех методов 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.
Это ужасно, но решает проблему точно! Проголосуйте только за то, что я угрожаю краткосрочным удержанием моего завтрака.
Это именно то, что я искал! Большое спасибо, я думал, что никогда не смогу хранить логические значения в XML как «истина» и «ложь».
Не лучший ответ: теперь у вас есть два объекта недвижимости вместо одного. Я нашел здесь гораздо более чистое решение: stackoverflow.com/questions/5963423/… В двух словах, создайте новый класс / структуру, которая реализует IXmlSerializable.
Возможно, вы захотите упомянуть, что вы используете для сериализации XML.