Usando C # .NET 2.0, tengo una clase de datos compuestos que tiene el [Serializable]
atributo. Estoy creando una XMLSerializer
clase y pasando eso al constructor:
XmlSerializer serializer = new XmlSerializer(typeof(DataClass));
Recibo una excepción que dice:
Se produjo un error al reflejar el tipo.
Dentro de la clase de datos hay otro objeto compuesto. ¿Esto también necesita tener el [Serializable]
atributo, o al tenerlo en el objeto superior, lo aplica recursivamente a todos los objetos dentro?
IList
cuando era necesarioList
.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.
fuente
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, 'Class1', del espacio de nombres ''. Use atributos XML para especificar un nombre XML único y / o espacio de nombres para el tipo.
Donde BaseNamespace.SubNamespace.Class1 es una subclase de BaseNamespace.Class1.
Lo que necesitaba hacer era agregar un atributo a una de las clases (agregué a la clase base):
Nota: Si tiene más capas de clases, también debe agregarles un atributo.
fuente
También tenga en cuenta que
XmlSerializer
no se pueden serializar las propiedades abstractas. Vea mi pregunta aquí (a la que he agregado el código de la solución).Serialización XML y tipos heredados
fuente
Las razones más comunes por mí:
fuente
Todos los objetos en el gráfico de serialización deben ser serializables.
Dado que
XMLSerializer
es una caja negra, verifique estos enlaces si desea depurar más en el proceso de serialización.Cambiar dónde XmlSerializer genera ensamblados temporales
CÓMO: Depurar en un ensamblado generado .NET XmlSerializer
fuente
Si necesita manejar atributos específicos (es decir, Diccionario, o cualquier clase), puede implementar la interfaz IXmlSerialiable , que le dará más libertad a costa de una codificación más detallada .
Hay un artículo interesante , que muestra una forma elegante de implementar una forma sofisticada para "extender" el XmlSerializer.
El artículo dice:
Debido a esto, sugiero implementar sus propias
IXmlSerializable
clases, para evitar implementaciones demasiado complicadas.... podría ser sencillo implementar nuestra
XmlSerializer
clase personalizada utilizando la reflexión.fuente
Descubrí que la clase Diccionario en .Net 2.0 no se puede serializar usando XML, pero se serializa bien cuando se usa la serialización binaria.
Encontré un trabajo por aquí .
fuente
Recientemente obtuve esto en una clase parcial de referencia web al agregar una nueva propiedad. La clase autogenerada estaba agregando los siguientes atributos.
Necesitaba agregar un atributo similar con un orden mayor que el anterior en la secuencia generada automáticamente y esto me lo solucionó.
fuente
Acabo de recibir el mismo error y descubrí que una propiedad de tipo
IEnumerable<SomeClass>
era el problema. Parece queIEnumerable
no se puede serializar directamente.En cambio, uno podría usar
List<SomeClass>
.fuente
También pensé que el atributo Serializable tenía que estar en el objeto, pero a menos que sea un novato completo (estoy en medio de una sesión de codificación nocturna) los siguientes trabajos del SnippetCompiler :
Me imagino que XmlSerializer está utilizando la reflexión sobre las propiedades públicas.
fuente
Tuve una situación en la que la Orden era la misma para dos elementos seguidos
.... algún código ...
Cuando cambié el código para incrementar el orden en uno para cada nueva Propiedad en la clase, el error desapareció.
fuente
Recibía el mismo error cuando creé una propiedad que tenía un tipo de datos -
Type
. En esto, recibí un error: hubo un error al reflejar el tipo. Seguí comprobando la 'InnerException' de cada excepción desde el muelle de depuración y obtuve el nombre de campo específico (que eraType
) en mi caso. La solución es la siguiente:fuente
También tenga en cuenta que no puede serializar los controles de la interfaz de usuario y que cualquier objeto que desee pasar al portapapeles debe ser serializable; de lo contrario, no se puede pasar a otros procesos.
fuente
He estado usando la
NetDataSerialiser
clase para serializar mis clases de dominio. NetDataContractSerializer Class .Las clases de dominio se comparten entre el cliente y el servidor.
fuente
Tuve el mismo problema y en mi caso el objeto tenía una ReadOnlyCollection. Una colección debe implementar el método Add para ser serializable.
fuente
Tengo una solución ligeramente diferente a todo lo descrito aquí hasta ahora, así que para cualquier civilización futura, ¡aquí está la mía!
Había declarado un tipo de datos de "tiempo" ya que el tipo original era a
TimeSpan
y posteriormente cambió aString
:sin embargo, el tipo real era una cadena
eliminando la
DateType
propiedadXml
se puede serializarfuente
O
fuente