XML Serialize логическое значение 0 и 1 - PullRequest
24 голосов
/ 17 сентября 2008

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

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

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

Ответы [ 3 ]

52 голосов
/ 17 сентября 2008

Вы также можете сделать это с помощью некоторого атрибута черной магии 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 голосов
/ 17 сентября 2008

Вы можете реализовать 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

1 голос
/ 17 сентября 2008

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

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

...