2009-11-20 10 views
6

Sto ottenendo il seguente errore nella mia domanda:Come posso trovare quale oggetto in ASP.NET non può essere serializzato?

Impossibile serializzare lo stato della sessione. In modalità 'SQLServer' 'StateServer' e, ASP.NET serializzare gli oggetti di stato sessione , e di conseguenza oggetti non serializzabili o oggetti MarshalByRefObject non sono consentito. La stessa restrizione si applica se la serializzazione simile è eseguita dall'archivio di stato sessione personalizzata in modalità 'Personalizzata'.

La traccia di stack non fornisce alcuna informazione valida su quale oggetto non è in grado di serializzare. C'è un buon modo per trovare il problema bambino?

Modifica: Ho trovato il problema, stavo cercando di serializzare un'istruzione Linq (non eseguita). Ma proverò a scegliere una risposta che avrebbe risolto al meglio questo problema.

+0

Non dovrebbe essere in realtà così difficile a venire con una funzione che trova ricorsivamente tutti i riferimenti di un oggetto e determinare se il nulla non è contrassegnato come [Serializable]. –

+0

Come faresti a sapere quali sarebbero serializzati e aggiunti alla sessione? –

risposta

5

Davvero, si dovrebbe principalmente essere archiviano i tuoi propri dati statali/oggetti (idealmente modellati come classi DTO), nel qual caso la risposta è: nessuna si marchio come [Serializable] o ISerializable. Non dovresti aggiungere controlli UI grezzi o altri oggetti sconosciuti allo stato di sessione. In particolare, per i motivi like this, che ha avuto un impatto significativo sulle prestazioni su un'app l'altro giorno.

+0

+1 Buon punto e link informativo. – IrishChieftain

+0

@Marc Gravell: Ho pensato di memorizzare un oggetto IEnumerable >, il problema era che stavo solo memorizzando la clausola Linq, ma in altri punti stavo usando l'estensione ToList() per enumerare. –

0

Il meglio che posso fare in una situazione simile è guardare ogni oggetto dei riferimenti di sessione e controllarlo per la presenza dell'attributo Serializable (o che l'oggetto implementa l'interfaccia ISerialzable).

2

MbUnit (ora Gallio) ha un test Assert.IsSerializable() che potrebbe tornare utile qui.

+0

Ho creato un test unitario che ha effettuato una serializzazione binaria sulla classe che ritenevo colpevole. –

0

È possibile trovare i tipi di colpevole che generano l'eccezione di serializzazione tramite il debug del codice framework .net. Almeno questo è quello che ho fatto.

1

Si può provare a serializzare l'oggetto e ispezionare lo System.Runtime.Serialization.SerializationException che viene lanciato quando non è serializzabile. Dovrebbe dirti quale membro o genitore dell'oggetto non può essere serializzato.

codice Esempio:

var f = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 
f.Serialize(new System.IO.MemoryStream(), yourObject); 
+1

Scoppio del passato qui. Ma sì, mi sembra di aver visto più dettagli in quell'eccezione rispetto a quando ho postato la domanda. –

Problemi correlati