¿Dónde está este objeto no serializable?
-
24-10-2019 - |
Pregunta
Estoy tratando de serializar un objeto y se lanza la siguiente serie de serialización:
Tipo 'System.Linq.enumerable+D__71`1 [[System.String, MSCORLIB, Versión = 4.0.0.0, cultura = neutral, publickeyToken = B77A5C561934E089]]]' En Assembly 'System.core, Version = 4.0.0.0, cultura = = Neutral, PublicKeyToken = B77A5C561934E089 'no está marcado como serializable.
¿Dónde está este objeto en mi código? ¿Cómo me enteraría? El gráfico de objetos es bastante grande.
Solución
Intente usar el reflector y vea si puede determinar dónde el tipo anónimo d__71`1
se está utilizando en su código.
Otros consejos
Me suena como si hubiera almacenado los resultados de llamar a un método enumerador sin convertir el resultado en una lista.
Cuando tienes un método como este:
public IEnumerable<string> GetMyWidgetNames()
{
foreach (var x in MyWidgets)
{
yield return x.Name;
}
}
El compilador convierte esto en un objeto anidado con un nombre como el que está viendo (uno con un nombre que nunca podría crear por los incrustados +
)
Si luego almacena una referencia a este objeto dentro de algo que intente serialise, obtendrá la excepción anotada por el OP.
La "solución" es asegurarse de que sus objetos serializados siempre conviertan cualquier tarea de IEnumerable <> en listas. En lugar de esto
public IEnumerable<string> WidgetNames { get; set; }
necesitas escribir:
public IEnumerable<string> WidgetNames
{
get { return mWidgetNames; }
set
{
if (value == null)
mWidgetNames= null
else mWidgetNames= value.ToList();
}
}
private List<string> mWidgetNames;
Intente serializar un objeto (tipo único) a la vez y ver cuándo explota. Puedes hacer esto manualmente o a través de la reflexión.