Подскажите пожалуйста, есть ли возможность десериализовать Xml-элемент подобной структуры:
...
var host = service.Host.Value;
Хочется верить, что атрибуты "value" всех вложенных узлов можно сразу замапить на string-свойства. Буду благодарен за любой совет.
Ответ
Может быть, пусть Service имплементирует интерфейс IXmlSerializable и реализует ReadXml разумным образом?
Сделать это только при помощи атрибутов невозможно: свойства определяют либо такой:
XmlSchema IXmlSerializable.GetSchema()
{
return null;
}
void IXmlSerializable.ReadXml(XmlReader reader)
{
if (reader.IsEmptyElement) // проверяем формат
throw new Exception(); // надо какое-то другое исключение, конечно
reader.ReadStartElement(); // читаем открывающий тег Service
while (reader.IsStartElement()) // пока есть вложенные теги...
processNode(reader); // читаем их
reader.ReadEndElement(); // читаем закрывающий тег
}
void processNode(XmlReader reader)
{
if (!reader.IsEmptyElement) // опять проверяем формат
throw new Exception();
if (reader.AttributeCount != 1) // то же самое
throw new Exception();
string name = reader.Name;
string value = reader.GetAttribute(0);
setField(name, value);
reader.ReadStartElement(); // переходим к следующему
}
void setField(string name, string value)
{
switch (name) // ну или reflection, если хотите
{
case "Host": Host = value; break;
case "Username": Username = value; break;
case "Password": Password = value; break;
}
}
void IXmlSerializable.WriteXml(XmlWriter writer)
{
serializeField(writer, "Host", Host);
serializeField(writer, "Username", Username);
serializeField(writer, "Password", Password);
}
void serializeField(XmlWriter writer, string name, string value)
{
writer.WriteStartElement(name);
writer.WriteStartAttribute("Value");
writer.WriteString(value);
writer.WriteEndElement();
}
}
Комментариев нет:
Отправить комментарий