Условное использование методов интерфейса IXmlSerializable
Мне нужен способ настроить механизм сериализации C# XML (de) следующим образом:
[Serializable]
public class MyElement : IXmlSerializable
{
[XmlAttribute]
public string PropertyX { get; set; }
[XmlElement]
public MySubElement SubElement { get; set; }
// .... other properties and elements...
[XmlIgnore]
public string ElementXml { get;set; }
public XmlSchema GetSchema() { return null; }
public void ReadXml(XmlReader reader)
{
// use default deserialization mechanism, like IXmlSerializable isn't implemented
}
public void WriteXml(XmlWriter writer)
{
if (!string.IsNullOrEmpty(ElementXml)) {
// serialize as ElementXml value
}
else
{
// serialize using default serialization mechanism, like IXmlSerializable isn't implemented
}
}
}
Мне нужно использовать эту парадигму для нескольких элементов, например, MySubElement также должен вести себя так. Объектная модель сложна, поэтому реализация этого атрибута по атрибуту или элемента по элементу не вариант для меня. Можно ли это сделать?
1 ответ
Рассмотреть возможность использования System.ComponentModel.DefaultValue
приписывать.
public class MyElement
{
[XmlAttribute]
public string PropertyX { get; set; }
[XmlElement]
public MySubElement SubElement { get; set; }
[DefaultValue("")]
public string ElementXml { get; set; }
}
Если ElementXml
является string.Empty
, то он не будет сериализован.
Вы, вероятно, должны использовать такой код:
private string _elementXml;
[DefaultValue("")]
public string ElementXml
{
get => _elementXml;
set => _elementXml = string.IsNullOrWhiteSpace(value) ? null : value;
}
В этом случае не будет сериализован не только ноль или пусто, но и любая строка пробела.