He encontrado un comportamiento sorprendente al usar XmlSerializer en C#. Considera la siguiente pieza de código..NET XmlSerializer y clases anidadas en 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" });
}
}
En este ejemplo I intenta serializar una instancia de A.B clase anidada, que en sí no hace uso de la clase de contenedor A de ninguna manera. Pero cuando intento para construir el XmlSerializer para ello, la excepción siguiente:
InvalidOperationException fue controlada:
Para ser XML serializable, tipos, que heredan de IEnumerable debe tener una implementación de Agregar (Sistema .Object) en todos los niveles de su jerarquía de herencia . Test.A no implementa Add (System.Object).
XmlSerializer está tratando de aplicar restricciones de serialización contra el tipo A cuando estoy tratando de serializar el tipo A.B. Sin embargo, tengo entendido que, aparte del acceso privilegiado a los datos en instancias del tipo externo, un tipo anidado no es especial y se comporta como si estuviera en un espacio de nombres.
¿Es este conocimiento incorrecto, y hace la semántica de tipos anidados o XmlSerializer justifica este comportamiento, o se siente como un error en XmlSerializer?
En lo que respecta específicamente a la semántica de XmlSerializer, ¿existe algún requisito documentado que imponga restricciones de XmlSerializer en todos los tipos externos cuando se aplica a un tipo anidado?
No tiene problemas con los tipos anidados. Su clase A no tiene una propiedad de tipo 'B'. –
Además, no use 'new XmlTextWriter()'. Eso ha estado en desuso desde .NET 2.0. Use 'XmlWriter.Create()' en su lugar. –
Lo siento, pero ha perdido el sentido de mi pregunta por completo. No estoy tratando de serializar A, y no estoy tratando de serializar B como una propiedad de A. Estoy tratando de serializarlo completamente independiente de A. Y soy consciente de la obsolescencia de TextWriter. Este es un ejemplo artificial de la parte superior de mi cabeza que he tratado de mantener breve. –