ASP.NET Session State Server - Salvataggio di dati non serializzati
Domanda
Come sapete, in ASP.NET, è possibile memorizzare i dati della sessione in una delle seguenti tre modalità:
- InProc
- Stato sessione
- SQL Server
Per la modalità InProc, è possibile memorizzare qualsiasi tipo di oggetto dati anche se non è serializzabile. Tuttavia, nelle modalità Stato sessione e SQL Server, è possibile archiviare solo dati serializzati.
Nel mio progetto, ho un portale già pronto che usa " InProc " modalità per memorizzare la sua sessione. Devo invece utilizzare lo stato della sessione a causa di alcuni problemi di scalabilità e gestione degli errori.
Il problema che questo portale sta memorizzando internamente oggetti non serializzati nel contesto della sessione (ovvero gli oggetti memorizzati non implementano l'interfaccia ISerializable). Non ho accesso al loro codice. C'è qualche soluzione in modo che io possa essere in grado di memorizzare gli oggetti della sessione in State Server senza modificare il loro codice. Ho ancora accesso al loro file web.config se questo potrebbe aiutare in qualsiasi tipo.
Soluzione
AFAIK, la risposta semplice è no. Se non ti dispiace cambiare il tuo codice, potresti iniettare un oggetto wrapper tra l'oggetto reale e il tuo e far sì che il tuo wrapper gestisca la serializzazione dell'oggetto avvolto (essenzialmente come surrogato della serializzazione) - ma a quel punto sarebbe quasi più facile riscrivi semplicemente il codice ...
Che tipo di oggetti sono? In genere, gli oggetti per lo stato della sessione sarebbero semplici classi di dati, quindi non dovrebbero esserci troppi problemi durante la serializzazione?
Altri suggerimenti
La serializzazione crea una rappresentazione dell'oggetto che può essere memorizzata e letta per ricreare lo stato dell'oggetto.
Se un oggetto contiene solo tipi di valore, potrebbe non essere necessario implementare ISerializable, ma solo l'attributo [Serializable].
Per rendere questa risposta più utile o diretta alla domanda in corso:
Non è possibile serializzare un oggetto che non è stato eliminato in qualche modo come serializzabile. Qualsiasi altro modo generico di ricreare un oggetto potrebbe far sì che l'oggetto non abbia lo stesso stato di prima che fosse "serializzato".
Come accennato da Marc, potresti farlo creando il tuo 'wrapper' serializzabile, ma dovresti essere molto familiare con l'oggetto in questione e l'oggetto dovrebbe avere metodi che gli consentano di essere ri -creato in questo modo.