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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top