Я столкнулся с некоторым удивительным поведением с использованием XmlSerializer в C#. Рассмотрим следующий фрагмент кода..NET XmlSerializer и вложенные классы в C#
public class A : IEnumerable
{
public class B
{
[XmlAttribute]
public string PropA { get; set; }
[XmlElement]
public string PropB { get; set; }
}
public IEnumerator GetEnumerator()
{
yield break;
}
}
class Program
{
static void Main (string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(A.B));
XmlTextWriter writer = new XmlTextWriter(@"E:\temp\test.xml", Encoding.Default);
serializer.Serialize(writer, new A.B() { PropA = "one", PropB = "two" });
}
}
В этом примере я стараюсь сериализовать экземпляр вложенного класса A.B, что само по себе не делает использование контейнера класса А в любом случае. Но когда я пытаюсь построить XmlSerializer для него следующее исключение:
InvalidOperationException было необработанное:
Для XML сериализации, типы, которые наследуют от IEnumerable должны реализация Add (System .Object) на всех уровнях их иерархии наследования . Test.A не реализует Add (System.Object).
XmlSerializer пытается применить ограничения сериализации к типу A, когда я на самом деле пытаюсь выполнить сериализацию типа A.B. Однако мое понимание заключается в том, что помимо привилегированного доступа к данным в экземплярах внешнего типа вложенный тип не является особым и ведет себя так, как если бы он находился в пространстве имен.
Неправильно ли это понимание, и ли семантика вложенных типов или XmlSerializer оправдывает это поведение, или это похоже на ошибку в XmlSerializer?
В отношении семантики XmlSerializer существует ли какое-либо документированное требование, которое применяет ограничения XmlSerializer для всех внешних типов при применении к вложенному типу?
У вас нет проблемы с вложенными типами. Ваш класс A не имеет свойства типа 'B'. –
Кроме того, не используйте 'new XmlTextWriter()'. Это было устаревшим с .NET 2.0. Вместо этого используйте 'XmlWriter.Create()'. –
Прошу прощения, но вы полностью упустили мой вопрос. Я не пытаюсь сериализовать A, и я не пытаюсь сериализовать B как свойство A. Я пытаюсь сериализовать его полностью независимо от A. И я знаю о устаревании TextWriter. Это надуманный пример с моей головы, который я старался держать в курсе. –