Dove si trova questo oggetto non serializzabile?
-
24-10-2019 - |
Domanda
Sto cercando di serializzare un oggetto e il seguente SerializationException è gettato:
Tipo 'System.Linq.Enumerable + d__71`1 [[System.String, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]' in assemblea 'System.Core, Version = 4.0.0.0 , Culture = neutral, PublicKeyToken = b77a5c561934e089' non è contrassegnato come serializzabile.
Dove si trova questo oggetto nel mio codice? Come faccio a sapere? Il grafico oggetto è abbastanza grande.
Soluzione
Provare a utilizzare Reflector e vedere se è possibile determinare dove il tipo anonimo d__71`1
viene utilizzato nel codice.
Altri suggerimenti
Suoni a me come se hai memorizzato i risultati della chiamata di un metodo enumeratore senza convertire il risultato a un elenco.
Quando si ha un metodo come questo:
public IEnumerable<string> GetMyWidgetNames()
{
foreach (var x in MyWidgets)
{
yield return x.Name;
}
}
Il compilatore trasforma questo in un oggetto nidificato con un nome come quello che stai vedendo (uno con un nome che non avrebbe mai potuto crea a causa del +
embedded)
Se poi si memorizza un riferimento a questo oggetto dentro qualcosa si tenta di serialise, si otterrà l'eccezione notato dal PO.
La "correzione" è quello di garantire che i vostri oggetti serializzati convertono sempre qualsiasi IEnumerable <> assegnazioni in elenchi. Al posto di questo
public IEnumerable<string> WidgetNames { get; set; }
è necessario scrivere:
public IEnumerable<string> WidgetNames
{
get { return mWidgetNames; }
set
{
if (value == null)
mWidgetNames= null
else mWidgetNames= value.ToList();
}
}
private List<string> mWidgetNames;
Prova a serializzare un oggetto (di tipo singolo) alla volta e vedere quando si fa saltare in aria. È possibile farlo manualmente o attraverso la riflessione.