Diverse risposte hanno coperto le ragioni per cui si potrebbe desiderare di utilizzare la serializzazione in generale. Sembra anche che tu voglia sapere perché una classe specifica ha attributo [Serializable]
e ti stai chiedendo perché questo potrebbe essere stato fatto.
Con ASP.NET la memoria di stato sessione predefinita è InProc
che consente di memorizzare qualsiasi oggetto come riferimento e lasciarlo nell'heap. Questo è il modo migliore per memorizzare lo stato della sessione, tuttavia, funziona solo se si utilizza un singolo thread di lavoro o se è possibile ricostruire automaticamente tutto lo stato della sessione se il thread di lavoro dovesse cambiare (improbabile). Per le altre modalità di memorizzazione dello stato (StateServer
e SQL Server
) tutti gli oggetti dello stato sessione devono essere serializzabili poiché il motore ASP.NET prima serializzerà questi oggetti utilizzando la serializzazione binaria prima di inviarli al supporto di memorizzazione.
Nel tuo caso, potresti utilizzare InProc
. Un motivo per cui è ancora possibile contrassegnare tutte le classi utilizzate in stato sessione come Serializable
e verificarle in questo modo è che potrebbe essere necessario cambiarlo in futuro (ad esempio, per utilizzare una Web Farm). Se non si progettano le classi di stato della sessione tenendo presente questo, sarà molto difficile eseguire la migrazione in futuro.
Inoltre, solo perché è possibile rimuovere l'attributo Serializable
e il programma "funziona" in un ambiente non significa che funzionerà in un altro ambiente. Ad esempio, può funzionare correttamente sotto il server Web di test di Visual Studio (che utilizza sempre l'istanza dello stato di sessione InProc
) e anche in un'istanza di sviluppo IIS, ma in tal caso, un'istanza IIS di produzione viene configurata per utilizzare una diversa modalità di archiviazione.
Queste differenze ambientali/di configurazione non sono necessariamente limitate alle applicazioni ASP.NET. Esistono altri motori applicativi che possono eseguire questa o anche applicazioni indipendenti (non è difficile creare questo tipo di ambiente configurabile).
Infine, è possibile che si stia lavorando con una libreria che può essere utilizzata da diverse applicazioni. Alcuni potrebbero dover memorizzare lo stato in modo serializzabile e altri no.
A causa di questi fattori è spesso una buona idea, almeno quando si costruisce una libreria, considerare la possibilità di contrassegnare classi di valore o classi di gestione dello stato con [Serializable]
. Tieni presente che questo aumenta il lavoro per testare queste classi e ci sono limiti a ciò che può essere serializzato (cioè una classe che contiene un riferimento socket o un riferimento a file aperti potrebbe non essere un buon candidato per la serializzazione in quanto le risorse esterne aperte non possono essere serializzate) quindi non abusare di questo.
Hai chiesto se l'utilizzo di [Serializable]
sarà più lento. No, non lo sarà. Questo attributo non ha effetti diretti sulle prestazioni. Tuttavia, se l'ambiente dell'applicazione viene modificato per serializzare l'oggetto, allora sì, le prestazioni saranno influenzate. È l'atto di serializzare e deserializzare che è più lento della semplice memorizzazione dell'oggetto sull'heap. [Si noti che alcune routine potrebbero essere scritte per cercare l'attributo Serializable
e quindi scegliere di serializzare, ma questo è raro; di solito è come ASP.NET e lasciato a un amministratore o utente per decidere se vogliono cambiare il mezzo di archiviazione.]
È possibile che venga archiviato in SessionState quando si utilizza Out-of-Proc/SQL? Quelle modalità di sessione richiedono la serializzazione. – vcsjones
Non sono sicuro che sto seguendo la tua domanda. Stai davvero chiedendo "perché dovrei voler serializzare un oggetto?" –
@ Kirk Woll, corretto – user194076