У меня есть кое-что близко, но не совсем Xml вы хотите. На самом деле, я думаю, вы увидите, что Xml, созданный ниже, имеет немного больше смысла, чем то, что у вас есть.
Чтобы начать работу, вы контролируете сериализацию и десериализацию с использованием атрибутов в System.Xml.Serialization
namespace. Несколько полезных из них, чтобы прочитать на это
Так что я высмеивал некоторый код, который точно соответствует своему усмотрению. Обратите внимание на добавление некоторых атрибутов, чтобы проинструктировать сериализатор, как я хочу, чтобы Xml был выложен.
[XmlInclude(typeof(AsciiValidator))]
[XmlInclude(typeof(RequiredValidator))]
[XmlInclude(typeof(StringLengthValidator))]
public class FieldValidator
{
[XmlElement("Next")]
public FieldValidator Next
{
get;
set;
}
[XmlElement("PropertyName")]
public string PropertyName
{
get;
set;
}
}
public class AsciiValidator: FieldValidator
{
}
public class RequiredValidator: FieldValidator
{
}
public class StringLengthValidator: FieldValidator
{
[XmlElement]
public int MinLength{get;set;}
[XmlElement]
public int MaxLength{get;set;}
}
[XmlRoot("ValidatorList")]
public class ValidatorList : List<FieldValidator>
{
}
Достопримечательность; Каждый класс наследующий FieldValidator
должен быть добавлен в список известных типов, используя XmlIncludeAttribute
так сериализатору знает, что делать с ними)
Затем я создал карту пример объекта:
var test = new ValidatorList();
test.Add(
new RequiredValidator()
{
PropertyName="CustRef",
Next = new AsciiValidator()
});
test.Add(
new RequiredValidator()
{
PropertyName="CurrencyIndicator",
Next = new StringLengthValidator(){
MinLength=3,
MaxLength = 10
}
});
Наконец я сказал сериализатор в сериализовать (и вывода результата на консоль)
var ser = new XmlSerializer(typeof(ValidatorList));
ser.Serialize(Console.Out,test);
Это результат:
<?xml version="1.0" encoding="utf-8"?>
<ValidatorList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="AsciiValidator" />
<PropertyName>CustRef</PropertyName>
</FieldValidator>
<FieldValidator xsi:type="RequiredValidator">
<Next xsi:type="StringLengthValidator">
<MinLength>3</MinLength>
<MaxLength>10</MaxLength>
</Next>
<PropertyName>CurrencyIndicator</PropertyName>
</FieldValidator>
</ValidatorList>
Не за миллион миль от того, что вы хотели. Существует необходимость в выводе определенных вещей определенным образом (например, xsi:type
сообщает сериализатору, как десериализоваться обратно на карту объекта). Надеюсь, это даст вам хорошее начало.
Вот живой, рабочий пример: http://rextester.com/OXPOB95358
Десериализация может быть сделано путем вызова метода Deserialize
на XmlSerializer.
Например, если ваш XML в строке:
var ser = new XmlSerializer(typeof(ValidatorList));
var test = "<..../>" // Your Xml
var xmlReader = XmlReader.Create(new StringReader(test));
var validatorList = (ValidatorList)ser.Deserialize(xmlReader);
Есть много переопределения десериализации, которые принимают различные входы в зависимости, если данные в потоке существующего читатель, или сохранить в файл.
FYI процесс превращения объекта в поток данных (например, Xml) - это * сериализация *. * десериализация * идет в другую сторону. Ive обновил ваш вопрос с правильными фразами, чтобы сделать его более ясным – Jamiec