Initial вопрос
Я хочу serialize
List<IXmlSerializable>
изменения XmlType из IXmlSerializable
класса динамически (так что я не могу использовать атрибуты тегов, чтобы сделать это)C# XML сериализации переопределение Тип IXmlSerializable класса
Я попытался использовать XmlAttributeOverrides, чтобы сделать это без успеха до сих пор.
Ниже приведен пример кода, иллюстрирующий проблему:
IXmlSerializable класс (от MSDN):
public class Person : IXmlSerializable
{
// Private state
private string personName;
// Constructors
public Person(string name)
{
personName = name;
}
public Person()
{
personName = null;
}
// Xml Serialization Infrastructure
public void WriteXml(XmlWriter writer)
{
writer.WriteString(personName);
}
public void ReadXml(XmlReader reader)
{
personName = reader.ReadString();
}
public XmlSchema GetSchema()
{
return (null);
}
// Print
public override string ToString()
{
return (personName);
}
}
Тест класс (с помощью консоли для вывода):
class Program
{
static void Main(string[] args)
{
List<Person> lPersonList = new List<Person> {
new Person("First"),
new Person("Second"),
new Person("Third")
};
XmlAttributeOverrides lOverrides = new XmlAttributeOverrides();
XmlAttributes lAttributes = new XmlAttributes { XmlType = new XmlTypeAttribute("Employee") };
lOverrides.Add(typeof(Person), lAttributes);
XmlSerializer lSerialiser = new XmlSerializer(typeof(List<Person>), lOverrides, null, new XmlRootAttribute("Employees"), null);
XmlSerializerNamespaces lNamespaces = new XmlSerializerNamespaces();
lNamespaces.Add("", "");
lSerialiser.Serialize(Console.Out, lPersonList, lNamespaces);
System.Console.WriteLine("Enter any key to close.");
System.Console.ReadKey();
}
}
Здесь это то, что я хочу получить:
<Employees>
<Employee>First</Employee>
<Employee>Second</Employee>
<Employee>Third</Employee>
</Employees>
Но я получаю эту ошибку во время выполнения:
System.InvalidOperationException: Только атрибут XmlRoot может быть указан для типа лица. Для указания типа схемы используйте XmlSchemaProviderAttribute.
Примечание Когда мой Person класс не выполняет IXmlSerializable
, все работает хорошо ...
Может кто-нибудь помочь мне в этом?
решение Выбирается (основано на @dbc answer)
Как @dbc отметил, используя класс «суррогатный» это самый простой способ сделать то, что я хочу. Но, как я уже сказал, мне нужно динамически изменять тип Person, а это значит, что я не могу использовать теги атрибутов.
Так что я до сих пор использую XmlAttributeOverrides
в моем окончательном проекте, здесь:
суррогатные List<Person>
Класс (так же, как @dbc без атрибутов тегов):
public class EmployeesListSurrogate
{
public List<Person> EmployeeList { get; set; }
public static implicit operator List<Person>(EmployeesListSurrogate surrogate)
{
return surrogate == null ? null : surrogate.EmployeeList;
}
public static implicit operator EmployeesListSurrogate(List<Person> employees)
{
return new EmployeesListSurrogate { EmployeeList = employees };
}
}
Тест класс с использованием суррогатным:
class Program
{
static void Main(string[] args)
{
List<Person> lPersonList = new List<Person> {
new Person("First"),
new Person("Second"),
new Person("Third")
};
XmlAttributeOverrides lOverrides = new XmlAttributeOverrides();
XmlAttributes lEmployeesListAttributes = new XmlAttributes { XmlRoot = new XmlRootAttribute("Employees") };
lOverrides.Add(typeof(EmployeesListSurrogate), lEmployeesListAttributes);
XmlAttributes lEmployeeAttributes = new XmlAttributes { XmlElements = { new XmlElementAttribute("Employee") } };
lOverrides.Add(typeof(EmployeesListSurrogate), "EmployeeList", lEmployeeAttributes);
XmlSerializer lSerializer = new XmlSerializer(typeof(EmployeesListSurrogate), lOverrides);
XmlSerializerNamespaces lNamespaces = new XmlSerializerNamespaces();
lNamespaces.Add("", "");
lSerializer.Serialize(Console.Out, (EmployeesListSurrogate)lPersonList, lNamespaces);
}
}
Я хочу завершить это с большой благодарностью @dbc, ваш ответ был очень полезным и информацией Я многому научился. Я не могу продвигать вас, но я надеюсь, что сообщество сделает это!