Мне нужно изменить поведение XmlWriter для моего проекта, чтобы изменить способ сериализации пустых элементов XML. В настоящее время мой код использует XmlWriter и XmlSerializer, например:
public string Serialize(object o)
{
XmlWriterSettings settings = new XmlWriterSettings();
...
StringWriter stringWriter = new StringWriter();
XmlWriter xmlWriter = XmlWriter.Create(stringWriter, settings);
XmlSerializer serializer = new XmlSerializer(o.GetType());
serializer.Serialize(xmlWriter, o);
return stringWriter.ToString();
}
При сериализации моего xml пустые элементы сериализуются в <emptyElement/>
, но мне нужен xml для сериализации пустых элементов в <emptyElement></emptyElement>
. Лучшее решение, которое я нашел для этого, было заявлено на этом форуме Microsoft несколько лет назад: https://social.msdn.microsoft.com/Forums/en-US/979315cf-6727-4979-a554-316218ab8b24/xml-serialize-empty-elements?forum=xmlandnetfx
Более быстрый и безопасный способ сделать это - написать собственный подкласс XmlWriter и передать его XmlSerializer.
YourXmlWriter агрегирует стандартный и переводит все вызовы WriteEndElement () в вызовы WriteFullEndElement ().
Я пытался написать свой собственный подкласс XmlWriter, переопределяя два метода, которые мне нужно переопределить:
public abstract class CustomXmlWriter : XmlWriter
{
public override void WriteEndElement()
{
WriteFullEndElement();
}
public override Task WriteEndElementAsync()
{
return WriteFullEndElementAsync();
}
}
Теоретически, я считаю, что это должно работать. Однако, пытаясь использовать код, я наталкиваюсь на кирпичную стену вокруг XmlWriter.Create . Я не могу привести полученный XmlWriter к своему CustomXmlWriter по очевидным причинам, и я не могу переопределить метод, так как это статический метод.
Как я должен иметь дело со статическим методом Create? Единственный другой способ сделать это - отказаться от идеи моего собственного CustomXmlWriter и просто манипулировать строкой в конце моего метода, но это выглядит очень неправильно. Я не знаю, возможно ли то, чего я пытаюсь достичь, или есть где-то простая настройка, которую я нигде не могу найти.