XmlSerializer: hubo un error al reflejar el tipo

Resuelto leora asked hace 16 años • 19 respuestas

Usando C# .NET 2.0, tengo una clase de datos compuestos que tiene el [Serializable]atributo. Estoy creando una XMLSerializerclase y pasándola al constructor:

XmlSerializer serializer = new XmlSerializer(typeof(DataClass));

Recibo una excepción que dice:

Hubo un error al reflejar el tipo.

Dentro de la clase de datos hay otro objeto compuesto. ¿Es necesario que esto también tenga el [Serializable]atributo, o al tenerlo en el objeto superior, lo aplica de forma recursiva a todos los objetos internos?

leora avatar Sep 13 '08 21:09 leora
Aceptado

Mire la excepción interna que está obteniendo. Le dirá qué campo/propiedad tiene problemas para serializar.

Puede excluir campos/propiedades de la serialización xml decorándolos con el [XmlIgnore]atributo.

XmlSerializerno usa el [Serializable]atributo, así que dudo que ese sea el problema.

Lamar avatar Sep 13 '2008 14:09 Lamar

Recuerde que las clases serializadas deben tener constructores predeterminados (es decir, sin parámetros). Si no tienes ningún constructor, está bien; pero si tiene un constructor con un parámetro, también deberá agregar el predeterminado.

Jeremy McGee avatar Sep 13 '2008 16:09 Jeremy McGee

Tuve un problema similar y resultó que el serializador no podía distinguir entre 2 clases que tenía con el mismo nombre (una era una subclase de la otra). La excepción interna se veía así:

'Tipos BaseNamespace.Class1' y 'BaseNamespace.SubNamespace.Class1' usan el nombre de tipo XML, 'Clase1', del espacio de nombres ''. Utilice atributos XML para especificar un nombre XML y/o espacio de nombres exclusivo para el tipo.

Donde BaseNamespace.SubNamespace.Class1 es una subclase de BaseNamespace.Class1.

Lo que tenía que hacer era agregar un atributo a una de las clases (lo agregué a la clase base):

[XmlType("BaseNamespace.Class1")]

Nota: Si tiene más capas de clases, también deberá agregarles un atributo.

Dennis Calla avatar Sep 16 '2011 21:09 Dennis Calla

Razones más comunes por mi parte:

 - the object being serialized has no parameterless constructor
 - the object contains Dictionary
 - the object has some public Interface members
Stefan Michev avatar Feb 22 '2014 12:02 Stefan Michev