Вопрос

В части 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, либо просто с помощью подстановки строк.Небольшой взлом, но довольно быстрый, как по времени разработки, так и по времени выполнения...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top